diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
 # madlang
 
+## 4.0.2.11
+
+  * Use `recursion` rather than `recursion-schemes`
+  * No longer depend on `TemplateHaskell`
+
+## 4.0.2.10
+
+  * Allow GHC <= 8.0.2
+
 ## 4.0.2.9
 
   * Use `getUserAppDataDirectory` instead of relying on the `$HOME` variable,
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,8 +1,11 @@
+import           Data.Foldable            (sequenceA_)
 import           Distribution.CommandLine
 import           Distribution.Simple
 
 main :: IO ()
-main = setManpath >>
-    writeManpages "man/madlang.1" "madlang.1" >>
-    writeBashCompletions "madlang" >>
-    defaultMain
+main = sequenceA_
+    [ setManpath
+    , writeManpages "man/madlang.1" "madlang.1"
+    , writeBashCompletions "madlang"
+    , defaultMain
+    ]
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -1,8 +1,8 @@
 -- | Provides `madlang` runMadlangutable
-module Main (
-    main ) where
+module Main ( main ) where
 
 import           Data.Maybe
+import           Data.Semigroup
 import qualified Data.Text                    as T
 import qualified Data.Text.Lazy               as TL
 import qualified Data.Text.Lazy.IO            as TLIO
diff --git a/madlang.cabal b/madlang.cabal
--- a/madlang.cabal
+++ b/madlang.cabal
@@ -1,19 +1,19 @@
 cabal-version: 1.18
 name: madlang
-version: 4.0.2.9
+version: 4.0.2.11
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2016-2018 Vanessa McHale
 maintainer: vamchale@gmail.com
 author: Vanessa McHale
 stability: experimental
-homepage: https://hub.darcs.net/vmchale/madlang
+tested-with: ghc ==8.2.2 ghc ==8.4.3 ghc ==8.0.2
 synopsis: Randomized templating language DSL
 description:
     Madlang is a text templating language written in Haskell,
     meant to explore computational creativity and generative
     literature.
-category: Web
+category: Text
 build-type: Custom
 extra-source-files:
     test/templates/*.mad
@@ -60,9 +60,12 @@
         Text.Madlibs.Cata.SemErr
         Text.Madlibs.Cata.Display
     default-language: Haskell2010
+    other-extensions: DeriveAnyClass DeriveFunctor DeriveGeneric
+                      DeriveLift FlexibleInstances OverloadedStrings TypeFamilies
+                      TemplateHaskell
     ghc-options: -Wall
     build-depends:
-        base >=4.11 && <5,
+        base >=4.9 && <5,
         megaparsec >=6.0,
         text -any,
         template-haskell -any,
@@ -76,14 +79,15 @@
         containers -any,
         titlecase >=1.0,
         th-lift-instances -any,
-        recursion-schemes -any,
+        recursion >=1.0.0.0,
         binary -any
     
-    if flag(development)
+    if (flag(development) && impl(ghc <8.4))
         ghc-options: -Werror
     
     if impl(ghc >=8.0)
         ghc-options: -Wincomplete-uni-patterns -Wincomplete-record-updates
+                     -Wredundant-constraints -Widentities
 
 executable madlang
     main-is: Main.hs
@@ -94,7 +98,7 @@
     default-language: Haskell2010
     ghc-options: -Wall
     build-depends:
-        base >=4.11,
+        base >=4.9,
         madlang -any,
         optparse-applicative -any,
         text -any,
@@ -109,11 +113,12 @@
     if flag(library)
         buildable: False
     
-    if flag(development)
+    if (flag(development) && impl(ghc <8.4))
         ghc-options: -Werror
     
     if impl(ghc >=8.0)
         ghc-options: -Wincomplete-uni-patterns -Wincomplete-record-updates
+                     -Wredundant-constraints -Widentities
 
 test-suite madlang-test
     type: exitcode-stdio-1.0
@@ -135,6 +140,7 @@
     
     if impl(ghc >=8.0)
         ghc-options: -Wincomplete-uni-patterns -Wincomplete-record-updates
+                     -Wredundant-constraints -Widentities
 
 benchmark madlang-bench
     type: exitcode-stdio-1.0
@@ -148,8 +154,12 @@
         megaparsec -any,
         text -any
     
+    if impl(ghc >=8.0)
+        ghc-options: -Wredundant-constraints -Widentities
+    
     if flag(development)
         ghc-options: -Werror
     
     if impl(ghc >=8.0)
         ghc-options: -Wincomplete-uni-patterns -Wincomplete-record-updates
+                     -Wredundant-constraints -Widentities
diff --git a/src/Text/Madlibs/Ana/Parse.hs b/src/Text/Madlibs/Ana/Parse.hs
--- a/src/Text/Madlibs/Ana/Parse.hs
+++ b/src/Text/Madlibs/Ana/Parse.hs
@@ -17,6 +17,7 @@
 import           Control.Monad.State
 import qualified Data.Map                    as M
 import           Data.Maybe
+import           Data.Semigroup
 import qualified Data.Text                   as T
 import           Data.Void
 import           Text.Madlibs.Ana.ParseUtils
diff --git a/src/Text/Madlibs/Ana/ParseUtils.hs b/src/Text/Madlibs/Ana/ParseUtils.hs
--- a/src/Text/Madlibs/Ana/ParseUtils.hs
+++ b/src/Text/Madlibs/Ana/ParseUtils.hs
@@ -19,6 +19,7 @@
 import           Data.List
 import qualified Data.Map                    as M
 import           Data.Maybe                  (mapMaybe)
+import           Data.Semigroup
 import qualified Data.Set                    as S
 import qualified Data.Text                   as T
 import           Data.Text.Titlecase
diff --git a/src/Text/Madlibs/Ana/Resolve.hs b/src/Text/Madlibs/Ana/Resolve.hs
--- a/src/Text/Madlibs/Ana/Resolve.hs
+++ b/src/Text/Madlibs/Ana/Resolve.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE FlexibleContexts  #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 -- | Module containing IO stuff to get/parse files with external dependencies
@@ -18,6 +17,7 @@
 import           Control.Monad               (replicateM, void)
 import           Control.Monad.IO.Class      (MonadIO, liftIO)
 import           Control.Monad.Random.Class
+import           Data.Semigroup
 import qualified Data.Text                   as T
 import           Data.Void
 import           System.Directory
diff --git a/src/Text/Madlibs/Cata/Display.hs b/src/Text/Madlibs/Cata/Display.hs
--- a/src/Text/Madlibs/Cata/Display.hs
+++ b/src/Text/Madlibs/Cata/Display.hs
@@ -1,7 +1,7 @@
 -- | Module with helper functions for displaying the parsed tree
 module Text.Madlibs.Cata.Display (displayTree) where
 
-import           Data.Functor.Foldable
+import           Control.Recursion
 import           Data.Tree
 import           Text.Madlibs.Internal.Types
 
diff --git a/src/Text/Madlibs/Cata/SemErr.hs b/src/Text/Madlibs/Cata/SemErr.hs
--- a/src/Text/Madlibs/Cata/SemErr.hs
+++ b/src/Text/Madlibs/Cata/SemErr.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE FlexibleContexts  #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 -- | Module defining the SemErr data type
diff --git a/src/Text/Madlibs/Generate/TH.hs b/src/Text/Madlibs/Generate/TH.hs
--- a/src/Text/Madlibs/Generate/TH.hs
+++ b/src/Text/Madlibs/Generate/TH.hs
@@ -1,8 +1,4 @@
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-{-# LANGUAGE DeriveLift                 #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE StandaloneDeriving         #-}
-{-# LANGUAGE TemplateHaskell            #-}
+{-# LANGUAGE TemplateHaskell #-}
 
 -- | Module containing Quasi-Quoter and Template Haskell splice for use as an EDSL.
 module Text.Madlibs.Generate.TH
@@ -12,6 +8,7 @@
 
 import           Control.Arrow               (first)
 import           Data.FileEmbed              (embedStringFile)
+import           Data.Semigroup
 import qualified Data.Text                   as T
 import qualified Data.Text.IO                as TIO
 import           Data.Void
diff --git a/src/Text/Madlibs/Internal/Types.hs b/src/Text/Madlibs/Internal/Types.hs
--- a/src/Text/Madlibs/Internal/Types.hs
+++ b/src/Text/Madlibs/Internal/Types.hs
@@ -1,23 +1,20 @@
-{-# LANGUAGE DeriveAnyClass       #-}
-{-# LANGUAGE DeriveFoldable       #-}
-{-# LANGUAGE DeriveFunctor        #-}
-{-# LANGUAGE DeriveGeneric        #-}
-{-# LANGUAGE DeriveLift           #-}
-{-# LANGUAGE DeriveTraversable    #-}
-{-# LANGUAGE FlexibleInstances    #-}
-{-# LANGUAGE OverloadedStrings    #-}
-{-# LANGUAGE TemplateHaskell      #-}
-{-# LANGUAGE TypeFamilies         #-}
-{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE DeriveAnyClass    #-}
+{-# LANGUAGE DeriveFunctor     #-}
+{-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE DeriveLift        #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
 
 -- | Module with the type of a random token
 module Text.Madlibs.Internal.Types where
 
 import           Control.Arrow              (second)
 import           Control.Monad.State
+import           Control.Recursion
 import           Data.Binary                (Binary)
 import           Data.Function
-import           Data.Functor.Foldable.TH   (makeBaseFunctor)
+import           Data.Semigroup
 import qualified Data.Text                  as T
 import           GHC.Generics               (Generic)
 import           Instances.TH.Lift          ()
@@ -61,6 +58,7 @@
 -- > (List [(0.5,"Hello you"), (0.5, "Hello me")])
 instance Monoid RandTok where
     mempty = Value ""
+    mappend = (<>)
 
 -- TODO make this a map instead of keys for faster parse.
 -- | State monad providing context, i.e. function we've already called before
@@ -70,4 +68,11 @@
 instance (Eq a) => Eq (Context a) where
     (==) = on (==) (flip evalState [])
 
-makeBaseFunctor ''RandTok
+data RandTokF a = ListF [(Prob, a)] | ValueF T.Text
+    deriving (Functor)
+
+type instance Base RandTok = RandTokF
+
+instance Recursive RandTok where
+    project (List psk) = ListF psk
+    project (Value t)  = ValueF t
diff --git a/src/Text/Madlibs/Internal/Utils.hs b/src/Text/Madlibs/Internal/Utils.hs
--- a/src/Text/Madlibs/Internal/Utils.hs
+++ b/src/Text/Madlibs/Internal/Utils.hs
@@ -1,6 +1,5 @@
-{-# LANGUAGE FlexibleInstances    #-}
-{-# LANGUAGE OverloadedStrings    #-}
-{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 -- | Internal utils to help out elsewhere
 module Text.Madlibs.Internal.Utils where
