diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+0.8.7:
+- Compatibility with template-haskell shipped with GHC 9.0
+
 0.8.6:
 - Add TypeApplications to default extensions
 
diff --git a/examples/BF.hs b/examples/BF.hs
--- a/examples/BF.hs
+++ b/examples/BF.hs
@@ -67,7 +67,9 @@
   lift MovR       = [|MovR|]
   lift (While xs) = [|While $(lift xs)|]
 
-#if MIN_VERSION_template_haskell(2,16,0)
+#if MIN_VERSION_template_haskell(2,17,0)
+  liftTyped = unsafeCodeCoerce . lift
+#elif MIN_VERSION_template_haskell(2,16,0)
   liftTyped = unsafeTExpCoerce . lift
   -- TODO: get stylish haskell to be happy w/ the below
   -- liftTyped Inp        = [||Inp||]
diff --git a/examples/HsHere.hs b/examples/HsHere.hs
--- a/examples/HsHere.hs
+++ b/examples/HsHere.hs
@@ -60,15 +60,15 @@
         ,quotePat = herePatQ}
 
 instance Lift Here where
-  lift = liftHere
-#if MIN_VERSION_template_haskell(2,16,0)
+  lift (TextH s)  = (litE . stringL) s
+  lift (CodeH e)  = [|show $(return e)|]
+  lift (ManyH hs) = [|concat $(listE (fmap lift hs))|]
+
+#if MIN_VERSION_template_haskell(2,17,0)
+  liftTyped = unsafeCodeCoerce . lift
+#elif MIN_VERSION_template_haskell(2,16,0)
   liftTyped = unsafeTExpCoerce . lift -- TODO: the right way?
 #endif
-
-liftHere :: Here -> ExpQ
-liftHere (TextH s)  = (litE . stringL) s
-liftHere (CodeH e)  = [|show $(return e)|]
-liftHere (ManyH hs) = [|concat $(listE (fmap liftHere hs))|]
 
 
 hereExpQ :: String -> ExpQ
diff --git a/examples/SKI.hs b/examples/SKI.hs
--- a/examples/SKI.hs
+++ b/examples/SKI.hs
@@ -71,7 +71,9 @@
 
 instance Lift SKI where
   lift = liftSKI
-#if MIN_VERSION_template_haskell(2,16,0)
+#if MIN_VERSION_template_haskell(2,17,0)
+  liftTyped = unsafeCodeCoerce . lift
+#elif MIN_VERSION_template_haskell(2,16,0)
   liftTyped = unsafeTExpCoerce . lift -- TODO: the right way?
 #endif
 
diff --git a/haskell-src-meta.cabal b/haskell-src-meta.cabal
--- a/haskell-src-meta.cabal
+++ b/haskell-src-meta.cabal
@@ -1,5 +1,5 @@
 name:               haskell-src-meta
-version:            0.8.6
+version:            0.8.7
 cabal-version:      >= 1.10
 build-type:         Simple
 license:            BSD3
@@ -22,7 +22,7 @@
                    haskell-src-exts >= 1.18 && < 1.24,
                    pretty >= 1.0 && < 1.2,
                    syb >= 0.1 && < 0.8,
-                   template-haskell >= 2.10 && < 2.17,
+                   template-haskell >= 2.10 && < 2.18,
                    th-orphans >= 0.12 && < 0.14
 
   if impl(ghc < 7.8)
diff --git a/src/Language/Haskell/Meta/Syntax/Translate.hs b/src/Language/Haskell/Meta/Syntax/Translate.hs
--- a/src/Language/Haskell/Meta/Syntax/Translate.hs
+++ b/src/Language/Haskell/Meta/Syntax/Translate.hs
@@ -20,10 +20,16 @@
 import qualified Data.List                    as List
 import qualified Language.Haskell.Exts.SrcLoc as Exts.SrcLoc
 import qualified Language.Haskell.Exts.Syntax as Exts
+import qualified Language.Haskell.TH.Lib      as TH
 import qualified Language.Haskell.TH.Syntax   as TH
 
 -----------------------------------------------------------------------------
 
+#if MIN_VERSION_template_haskell(2,17,0)
+type TyVarBndr_ flag = TH.TyVarBndr flag
+#else
+type TyVarBndr_ flag = TH.TyVarBndr
+#endif
 
 class ToName a where toName :: a -> TH.Name
 class ToNames a where toNames :: a -> [TH.Name]
@@ -37,7 +43,7 @@
 class ToLoc  a where toLoc  :: a -> TH.Loc
 class ToCxt  a where toCxt  :: a -> TH.Cxt
 class ToPred a where toPred :: a -> TH.Pred
-class ToTyVars a where toTyVars :: a -> [TH.TyVarBndr]
+class ToTyVars a where toTyVars :: a -> [TyVarBndr_ ()]
 class ToMaybeKind a where toMaybeKind :: a -> Maybe TH.Kind
 #if MIN_VERSION_template_haskell(2,11,0)
 class ToInjectivityAnn a where toInjectivityAnn :: a -> TH.InjectivityAnn
@@ -279,7 +285,11 @@
   toExp (Exts.If _ a b c)              = TH.CondE (toExp a) (toExp b) (toExp c)
   toExp (Exts.MultiIf _ ifs)           = TH.MultiIfE (map toGuard ifs)
   toExp (Exts.Case _ e alts)           = TH.CaseE (toExp e) (map toMatch alts)
+#if MIN_VERSION_template_haskell(2,17,0)
+  toExp (Exts.Do _ ss)                 = TH.DoE Nothing (map toStmt ss)
+#else
   toExp (Exts.Do _ ss)                 = TH.DoE (map toStmt ss)
+#endif
   toExp e@Exts.MDo{}                   = noTH "toExp" e
   toExp (Exts.Tuple _ Exts.Boxed xs)   = TH.TupE (fmap toTupEl xs)
   toExp (Exts.Tuple _ Exts.Unboxed xs) = TH.UnboxedTupE (fmap toTupEl xs)
@@ -347,9 +357,14 @@
 instance ToName TH.Name where
   toName = id
 
-instance ToName TH.TyVarBndr where
+instance ToName (TyVarBndr_ flag) where
+#if MIN_VERSION_template_haskell(2,17,0)
+  toName (TH.PlainTV n _)    = n
+  toName (TH.KindedTV n _ _) = n
+#else
   toName (TH.PlainTV n)    = n
   toName (TH.KindedTV n _) = n
+#endif
 
 #if !MIN_VERSION_haskell_src_exts(1,21,0)
 instance ToType (Exts.Kind l) where
@@ -375,12 +390,26 @@
 toKind :: Exts.Kind l -> TH.Kind
 toKind = toType
 
-toTyVar :: Exts.TyVarBind l -> TH.TyVarBndr
+toTyVar :: Exts.TyVarBind l -> TyVarBndr_ ()
+#if MIN_VERSION_template_haskell(2,17,0)
+toTyVar (Exts.KindedVar _ n k) = TH.KindedTV (toName n) () (toKind k)
+toTyVar (Exts.UnkindedVar _ n) = TH.PlainTV (toName n) ()
+#else
 toTyVar (Exts.KindedVar _ n k) = TH.KindedTV (toName n) (toKind k)
 toTyVar (Exts.UnkindedVar _ n) = TH.PlainTV (toName n)
+#endif
 
+#if MIN_VERSION_template_haskell(2,17,0)
+toTyVarSpec :: TyVarBndr_ () -> TH.TyVarBndrSpec
+toTyVarSpec (TH.KindedTV n () k) = TH.KindedTV n TH.SpecifiedSpec k
+toTyVarSpec (TH.PlainTV n ()) = TH.PlainTV n TH.SpecifiedSpec
+#else
+toTyVarSpec :: TyVarBndr_ flag -> TyVarBndr_ flag
+toTyVarSpec = id
+#endif
+
 instance ToType (Exts.Type l) where
-  toType (Exts.TyForall _ tvbM cxt t) = TH.ForallT (maybe [] (fmap toTyVar) tvbM) (toCxt cxt) (toType t)
+  toType (Exts.TyForall _ tvbM cxt t) = TH.ForallT (maybe [] (fmap (toTyVarSpec . toTyVar)) tvbM) (toCxt cxt) (toType t)
   toType (Exts.TyFun _ a b) = toType a .->. toType b
   toType (Exts.TyList _ t) = TH.ListT `TH.AppT` toType t
   toType (Exts.TyTuple _ b ts) = foldAppT (tuple . length $ ts) (fmap toType ts)
@@ -713,7 +742,7 @@
 
 qualConDeclToCon :: Exts.QualConDecl l -> TH.Con
 qualConDeclToCon (Exts.QualConDecl _ Nothing Nothing cdecl) = conDeclToCon cdecl
-qualConDeclToCon (Exts.QualConDecl _ ns cxt cdecl) = TH.ForallC (toTyVars ns)
+qualConDeclToCon (Exts.QualConDecl _ ns cxt cdecl) = TH.ForallC (toTyVarSpec <$> toTyVars ns)
                                                     (toCxt cxt)
                                                     (conDeclToCon cdecl)
 
diff --git a/src/Language/Haskell/Meta/Utils.hs b/src/Language/Haskell/Meta/Utils.hs
--- a/src/Language/Haskell/Meta/Utils.hs
+++ b/src/Language/Haskell/Meta/Utils.hs
@@ -161,7 +161,11 @@
         (t',env4,new4) = renameT env3 new3 t
     in (ForallT ns'' cxt' t', env4, new4)
   where
+#if MIN_VERSION_template_haskell(2,17,0)
+    unVarT (VarT n) = PlainTV n SpecifiedSpec
+#else
     unVarT (VarT n) = PlainTV n
+#endif
     unVarT ty       = error $ "renameT: unVarT: TODO for" ++ show ty
     renamePreds = renameThings renamePred
     renamePred = renameT
@@ -230,7 +234,7 @@
 decCons _                        = []
 
 
-decTyVars :: Dec -> [TyVarBndr]
+decTyVars :: Dec -> [TyVarBndr_ ()]
 #if MIN_VERSION_template_haskell(2,11,0)
 decTyVars (DataD _ _ ns _ _ _)    = ns
 decTyVars (NewtypeD _ _ ns _ _ _) = ns
