diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,6 @@
+## 5.2.1 [2020.10.04]
+* Allow building with `template-haskell-2.17.0.0` (GHC 9.0).
+
 ## 5.2
 
 * Add instances for `Tree` (from `containers`)
diff --git a/recursion-schemes.cabal b/recursion-schemes.cabal
--- a/recursion-schemes.cabal
+++ b/recursion-schemes.cabal
@@ -1,6 +1,6 @@
 name:          recursion-schemes
 category:      Control, Recursion
-version:       5.2
+version:       5.2.1
 license:       BSD2
 cabal-version: >= 1.10
 license-file:  LICENSE
@@ -82,9 +82,9 @@
 
   if flag(template-haskell)
     build-depends:
-      template-haskell >= 2.5.0.0 && < 2.17,
+      template-haskell >= 2.5.0.0 && < 2.18,
       base-orphans     >= 0.5.4   && < 0.9,
-      th-abstraction   >= 0.3     && < 0.4
+      th-abstraction   >= 0.4     && < 0.5
     exposed-modules:
       Data.Functor.Foldable.TH
 
@@ -92,6 +92,8 @@
       Paths_recursion_schemes
 
   ghc-options: -Wall
+  if impl(ghc >= 8.6)
+    ghc-options: -Wno-star-is-type
   default-language: Haskell2010
 
 test-suite Expr
diff --git a/src/Data/Functor/Foldable/TH.hs b/src/Data/Functor/Foldable/TH.hs
--- a/src/Data/Functor/Foldable/TH.hs
+++ b/src/Data/Functor/Foldable/TH.hs
@@ -14,6 +14,7 @@
 import Data.Functor.Identity
 import Language.Haskell.TH
 import Language.Haskell.TH.Datatype as TH.Abs
+import Language.Haskell.TH.Datatype.TyVarBndr
 import Language.Haskell.TH.Syntax (mkNameG_tc, mkNameG_v)
 import Data.Char (GeneralCategory (..), generalCategory)
 import Data.Orphans ()
@@ -231,14 +232,14 @@
                           Datatype        -> False
                           Newtype         -> False
 
-    toTyVarBndr :: Type -> TyVarBndr
-    toTyVarBndr (VarT n)          = PlainTV n
-    toTyVarBndr (SigT (VarT n) k) = KindedTV n k
+    toTyVarBndr :: Type -> TyVarBndrUnit
+    toTyVarBndr (VarT n)          = plainTV n
+    toTyVarBndr (SigT (VarT n) k) = kindedTV n k
     toTyVarBndr _                 = error "toTyVarBndr"
 
 makePrimForDI' :: BaseRules
                -> Maybe (Name -> [Dec] -> Dec) -- ^ make instance
-               -> Bool -> Name -> [TyVarBndr]
+               -> Bool -> Name -> [TyVarBndrUnit]
                -> [ConstructorInfo] -> DecsQ
 makePrimForDI' rules mkInstance' isNewtype tyName vars cons = do
     -- variable parameters
@@ -251,7 +252,7 @@
     rName <- newName "r"
     let r = VarT rName
     -- Vars
-    let varsF = vars ++ [PlainTV rName]
+    let varsF = vars ++ [plainTV rName]
 
     -- #33
     cons' <- traverse (conTypeTraversal resolveTypeSynonyms) cons
@@ -297,7 +298,7 @@
     let mkInstance :: Name -> [Dec] -> Dec
         mkInstance = case mkInstance' of
             Just f  -> f
-            Nothing -> \n -> 
+            Nothing -> \n ->
 #if MIN_VERSION_template_haskell(2,11,0)
                 InstanceD Nothing [] (ConT n `AppT` s)
 #else
@@ -383,7 +384,7 @@
 headOfType t          = fail $ "headOfType: " ++ show t
 
 -- | Extract type variables
-typeVars :: [TyVarBndr] -> [Name]
+typeVars :: [TyVarBndr_ flag] -> [Name]
 typeVars = map tvName
 
 -- | Apply arguments to a type constructor.
