diff --git a/doc/compress.html b/doc/compress.html
index 1f1d0f0764b0aae45cc9dd7416f203296603ad95..25379782906f300c610689bc11e2f6779a26daa1 100644
--- a/doc/compress.html
+++ b/doc/compress.html
@@ -149,6 +149,7 @@
           <option value="http://codemirror.net/mode/haml/haml.js">haml.js</option>
           <option value="http://codemirror.net/mode/handlebars/handlebars.js">handlebars.js</option>
           <option value="http://codemirror.net/mode/haskell/haskell.js">haskell.js</option>
+          <option value="http://codemirror.net/mode/haskell-literate/haskell-literate.js">haskell-literate.js</option>
           <option value="http://codemirror.net/mode/haxe/haxe.js">haxe.js</option>
           <option value="http://codemirror.net/mode/htmlembedded/htmlembedded.js">htmlembedded.js</option>
           <option value="http://codemirror.net/mode/htmlmixed/htmlmixed.js">htmlmixed.js</option>
diff --git a/mode/haskell-literate/haskell-literate.js b/mode/haskell-literate/haskell-literate.js
index f50d2fb10084d12f710d0525d2435475e31e2a45..f51e96b6047895242f62ece567beb501e91b8589 100644
--- a/mode/haskell-literate/haskell-literate.js
+++ b/mode/haskell-literate/haskell-literate.js
@@ -9,30 +9,35 @@
   else // Plain browser env
     mod(CodeMirror)
 })(function (CodeMirror) {
-  CodeMirror.defineMode("haskell-literate", function (config) {
-    var haskellMode = CodeMirror.getMode(config, "haskell")
+  "use strict"
+
+  CodeMirror.defineMode("haskell-literate", function (config, parserConfig) {
+    var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || "haskell")
+
     return {
       startState: function () {
         return {
-          haskellCode: false,
-          haskellState: CodeMirror.startState(haskellMode)
+          inCode: false,
+          baseState: CodeMirror.startState(baseMode)
         }
       },
       token: function (stream, state) {
-        if ((stream.sol() && stream.next() == '>') || state.haskellCode) {
-          state.haskellCode = true
-          return haskellMode.token(stream, state.haskellState)
+        if (stream.sol()) {
+          if (state.inCode = stream.eat(">"))
+            return "meta"
+        }
+        if (state.inCode) {
+          return baseMode.token(stream, state.baseState)
         } else {
           stream.skipToEnd()
           return "comment"
         }
       },
-      blankLine: function (state) {
-        state.haskellCode = false
-      },
       innerMode: function (state) {
-        return {state: state.haskellState, mode: haskellMode};
+        return state.inCode ? {state: state.baseState, mode: baseMode} : null
       }
     }
   })
+
+  CodeMirror.defineMIME("text/x-literate-haskell", "haskell-literate")
 })
diff --git a/mode/haskell-literate/index.html b/mode/haskell-literate/index.html
index 051724776b803a1507d59bb4fb80549d8e4f5c01..8c9bc60d151f34108c63517a22616dad9e22f365 100644
--- a/mode/haskell-literate/index.html
+++ b/mode/haskell-literate/index.html
@@ -269,6 +269,12 @@ Utilities
     </textarea>
   </form>
 
+  <p><strong>MIME types
+  defined:</strong> <code>text/x-literate-haskell</code>.</p>
+
+  <p>Parser configuration parameters recognized: <code>base</code> to
+  set the base mode (defaults to <code>"haskell"</code>).</p>
+
   <script>
     var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "haskell-literate"});
   </script>
diff --git a/mode/index.html b/mode/index.html
index 072b89bdaaa8c73b43ef7db76cc1fb82216f2ce1..2a159ec53f0c41df3b0c9723a9731c66b7e1ed1a 100644
--- a/mode/index.html
+++ b/mode/index.html
@@ -68,7 +68,7 @@ option.</p>
       <li><a href="groovy/index.html">Groovy</a></li>
       <li><a href="haml/index.html">HAML</a></li>
       <li><a href="handlebars/index.html">Handlebars</a></li>
-      <li><a href="haskell/index.html">Haskell</a></li>
+      <li><a href="haskell/index.html">Haskell</a> (<a href="haskell-literate/index.html">Literate</a>)</li>
       <li><a href="haxe/index.html">Haxe</a></li>
       <li><a href="htmlembedded/index.html">HTML embedded</a> (JSP, ASP.NET)</li>
       <li><a href="htmlmixed/index.html">HTML mixed-mode</a></li>
diff --git a/mode/meta.js b/mode/meta.js
index 69e2a3ef697cd7ec27ddeb8967e9397ed6948e7f..e4b97360c368e91bcc5a5fc84ce232b88736f3ea 100644
--- a/mode/meta.js
+++ b/mode/meta.js
@@ -56,6 +56,7 @@
     {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy"]},
     {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]},
     {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]},
+    {name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"]},
     {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]},
     {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]},
     {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]},