diff --git a/shake-ext.cabal b/shake-ext.cabal
--- a/shake-ext.cabal
+++ b/shake-ext.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.18
 name: shake-ext
-version: 2.9.0.1
+version: 2.10.0.0
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2018 Vanessa McHale
@@ -36,6 +36,7 @@
         Development.Shake.C
         Development.Shake.CCJS
         Development.Shake.Elm
+        Development.Shake.Literate
     hs-source-dirs: src
     other-modules:
         Development.Shake.TH
diff --git a/src/Development/Shake/Literate.hs b/src/Development/Shake/Literate.hs
new file mode 100644
--- /dev/null
+++ b/src/Development/Shake/Literate.hs
@@ -0,0 +1,44 @@
+-- | Module containing functions for working with the
+-- [illiterate](http://github.com/vmchale/illiterate) preprocessor for literate
+-- programs.
+module Development.Shake.Literate ( -- * Action
+                                    illiterateA
+                                  -- * Rules
+                                  , literateHaskell
+                                  , literateIdris
+                                  , literateAlex
+                                  , literateHappy
+                                  ) where
+
+import           Development.Shake
+import           Development.Shake.FilePath
+
+illiterateA :: FilePath -- ^ Literate source file
+            -> FilePath -- ^ Generated source
+            -> Action ()
+illiterateA inF outF = do
+    (Stdout o) <- cmd ["lit", inF]
+    liftIO $ writeFile outF o
+
+literateRules :: String -- ^ File extension
+              -> Rules ()
+literateRules ext = pat %> g
+    where pat = "//*." <> ('l' : ext)
+          g out = let new = fst (splitExtension out) <> ('.' : ext)
+            in illiterateA out new
+
+-- | Rules for building @.lhs@ files.
+literateHaskell :: Rules ()
+literateHaskell = literateRules "hs"
+
+-- | Rules for building @.lidr@ files.
+literateIdris :: Rules ()
+literateIdris = literateRules "idr"
+
+-- | Rules for building @.lx@ files
+literateAlex :: Rules ()
+literateAlex = literateRules "x"
+
+-- | Rules for building @.ly@ files
+literateHappy :: Rules ()
+literateHappy = literateRules "y"
