diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,6 @@
+# template-haskell-optics-0.2 (2022-03-22)
+* Add support for GHC 9.0 and 9.2
+* Drop the `DataPrim` type synonym
+
+# template-haskell-optics-0.1 (2020-08-29)
+* Initial release
diff --git a/src/Language/Haskell/TH/Optics.hs b/src/Language/Haskell/TH/Optics.hs
--- a/src/Language/Haskell/TH/Optics.hs
+++ b/src/Language/Haskell/TH/Optics.hs
@@ -1,5 +1,6 @@
-{-# LANGUAGE CPP              #-}
-{-# LANGUAGE LambdaCase       #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE LambdaCase #-}
 -- |
 -- Module: Language.Haskell.TH.Optics
 -- Description: Optics for types defined in "Language.Haskell.TH".
@@ -66,11 +67,9 @@
   -- ** Bang Lenses
   , bangSourceUnpackedness
   , bangSourceStrictness
-#if MIN_VERSION_template_haskell(2,12,0)
   -- ** DerivClause Lenses
   , derivClauseStrategy
   , derivClauseCxt
-#endif
   -- * Prisms
   -- ** Info Prisms
   , _ClassI
@@ -81,9 +80,7 @@
   , _DataConI
   , _VarI
   , _TyVarI
-#if MIN_VERSION_template_haskell(2,12,0)
   , _PatSynI
-#endif
   -- ** Dec Prisms
   , _FunD
   , _ValD
@@ -105,14 +102,11 @@
   , _DefaultSigD
   , _DataFamilyD
   , _OpenTypeFamilyD
-#if MIN_VERSION_template_haskell(2,12,0)
   , _PatSynD
   , _PatSynSigD
-#endif
 #if MIN_VERSION_template_haskell(2,15,0)
   , _ImplicitParamBindD
 #endif
-#if MIN_VERSION_template_haskell(2,12,0)
   -- ** PatSynDir Prisms
   , _Unidir
   , _ImplBidir
@@ -121,7 +115,6 @@
   , _PrefixPatSyn
   , _InfixPatSyn
   , _RecordPatSyn
-#endif
   -- ** Con Prisms
   , _NormalC
   , _RecC
@@ -166,9 +159,7 @@
   , _RuleP
   , _AnnP
   , _LineP
-#if MIN_VERSION_template_haskell(2,12,0)
   , _CompleteP
-#endif
   -- ** Inline Prisms
   , _NoInline
   , _Inline
@@ -203,9 +194,7 @@
   , _ConE
   , _LitE
   , _AppE
-#if MIN_VERSION_template_haskell(2,12,0)
   , _AppTypeE
-#endif
   , _InfixE
   , _UInfixE
   , _ParensE
@@ -213,9 +202,7 @@
   , _LamCaseE
   , _TupE
   , _UnboxedTupE
-#if MIN_VERSION_template_haskell(2,12,0)
   , _UnboxedSumE
-#endif
   , _CondE
   , _MultiIfE
   , _LetE
@@ -274,9 +261,7 @@
   , _VarP
   , _TupP
   , _UnboxedTupP
-#if MIN_VERSION_template_haskell(2,12,0)
   , _UnboxedSumP
-#endif
   , _ConP
   , _InfixP
   , _UInfixP
@@ -298,9 +283,7 @@
   , _PromotedT
   , _TupleT
   , _UnboxedTupleT
-#if MIN_VERSION_template_haskell(2,12,0)
   , _UnboxedSumT
-#endif
   , _ArrowT
   , _EqualityT
   , _ListT
@@ -321,6 +304,14 @@
 #if MIN_VERSION_template_haskell(2,16,0)
   , _ForallVisT
 #endif
+#if MIN_VERSION_template_haskell(2,17,0)
+  , _MulArrowT
+#endif
+#if MIN_VERSION_template_haskell(2,17,0)
+  -- ** Specificity Prisms
+  , _SpecifiedSpec
+  , _InferredSpec
+#endif
   -- ** TyVarBndr Prisms
   , _PlainTV
   , _KindedTV
@@ -331,17 +322,18 @@
   -- ** TyLit Prisms
   , _NumTyLit
   , _StrTyLit
+#if MIN_VERSION_template_haskell(2,18,0)
+  , _CharTyLit
+#endif
   -- ** Role Prisms
   , _NominalR
   , _RepresentationalR
   , _PhantomR
   , _InferR
-#if MIN_VERSION_template_haskell(2,12,0)
   -- ** DerivStrategy Prisms
   , _StockStrategy
   , _AnyclassStrategy
   , _NewtypeStrategy
-#endif
   ) where
 
 import Data.Map as Map hiding (map, toList)
@@ -349,6 +341,7 @@
 import Data.Set as Set hiding (map, toList)
 import Data.Word
 import Language.Haskell.TH
+import Language.Haskell.TH.Datatype.TyVarBndr
 import Language.Haskell.TH.Syntax
 
 import Data.Set.Optics
@@ -364,10 +357,8 @@
   -- | Extract (or modify) the 'Name' of something
   name :: Lens' t Name
 
-instance HasName TyVarBndr where
-  name = lensVL $ \f -> \case
-    PlainTV n    -> PlainTV <$> f n
-    KindedTV n k -> (`KindedTV` k) <$> f n
+instance HasName (TyVarBndr_ flag) where
+  name = lensVL traverseTVName
 
 instance HasName Name where
   name = lensVL id
@@ -433,7 +424,7 @@
 instance HasTypes TySynEqn where
 #if MIN_VERSION_template_haskell(2,15,0)
   types = traversalVL $ \f (TySynEqn mtvbs lhs rhs) ->
-    TySynEqn <$> traverseOf (_Just % traversed % _KindedTV % _2) f mtvbs
+    TySynEqn <$> traverseOf (_Just % traversed % traversalVL traverseTVKind) f mtvbs
              <*> traverseOf types f lhs
              <*> traverseOf types f rhs
 #else
@@ -452,7 +443,7 @@
   -- 'Traversal' laws, when in doubt generate your names with 'newName'.
   typeVarsEx :: Set Name -> Traversal' t Name
 
-instance HasTypeVars TyVarBndr where
+instance HasTypeVars (TyVarBndr_ flag) where
   typeVarsEx s = traversalVL $ \f b ->
     if view name b `Set.member` s
     then pure b
@@ -495,19 +486,19 @@
     t@TupleT{}         -> pure t
     t@UnboxedTupleT{}  -> pure t
     t@WildCardT{}      -> pure t
-#if MIN_VERSION_template_haskell(2,12,0)
     t@UnboxedSumT{}    -> pure t
-#endif
 #if MIN_VERSION_template_haskell(2,15,0)
     AppKindT t k       -> AppKindT <$> traverseOf (typeVarsEx s) f t
                                    <*> traverseOf (typeVarsEx s) f k
     ImplicitParamT n t -> ImplicitParamT n <$> traverseOf (typeVarsEx s) f t
 #endif
 #if MIN_VERSION_template_haskell(2,16,0)
-    ForallVisT bs ty -> let s' = s `Set.union` setOf typeVars bs
-                        in ForallVisT bs <$> traverseOf (typeVarsEx s') f ty
+    ForallVisT bs ty   -> let s' = s `Set.union` setOf typeVars bs
+                          in ForallVisT bs <$> traverseOf (typeVarsEx s') f ty
 #endif
-
+#if MIN_VERSION_template_haskell(2,17,0)
+    t@MulArrowT{}      -> pure t
+#endif
 
 instance HasTypeVars Con where
   typeVarsEx s = traversalVL $ \f -> \case
@@ -567,9 +558,7 @@
   substType _ t@TupleT{}          = t
   substType _ t@UnboxedTupleT{}   = t
   substType _ t@WildCardT{}       = t
-#if MIN_VERSION_template_haskell(2,12,0)
-  substType _ t@UnboxedSumT{}   = t
-#endif
+  substType _ t@UnboxedSumT{}     = t
 #if MIN_VERSION_template_haskell(2,15,0)
   substType m (AppKindT t k)       = AppKindT (substType m t) (substType m k)
   substType m (ImplicitParamT n t) = ImplicitParamT n (substType m t)
@@ -578,6 +567,9 @@
   substType m (ForallVisT bs ty)   = ForallVisT bs (substType m' ty)
     where m' = foldrOf typeVars Map.delete m bs
 #endif
+#if MIN_VERSION_template_haskell(2,17,0)
+  substType _ t@MulArrowT{}        = t
+#endif
 
 instance SubstType t => SubstType [t] where
   substType = map . substType
@@ -702,7 +694,7 @@
   g (TypeFamilyHead n _    _  _ )   = n
   s (TypeFamilyHead _ tvbs rs ia) n = TypeFamilyHead n tvbs rs ia
 
-typeFamilyHeadTyVarBndrs :: Lens' TypeFamilyHead [TyVarBndr]
+typeFamilyHeadTyVarBndrs :: Lens' TypeFamilyHead [TyVarBndrUnit]
 typeFamilyHeadTyVarBndrs = lens g s where
   g (TypeFamilyHead _ tvbs _  _ )      = tvbs
   s (TypeFamilyHead n _    rs ia) tvbs = TypeFamilyHead n tvbs rs ia
@@ -727,7 +719,6 @@
   g (Bang _  su) = su
   s (Bang ss _ ) = Bang ss
 
-#if MIN_VERSION_template_haskell(2,12,0)
 derivClauseStrategy :: Lens' DerivClause (Maybe DerivStrategy)
 derivClauseStrategy = lens g s where
   g (DerivClause mds _)     = mds
@@ -737,7 +728,6 @@
 derivClauseCxt = lens g s where
   g (DerivClause _   c) = c
   s (DerivClause mds _) = DerivClause mds
-#endif
 
 _ClassI :: Prism' Info (Dec, [InstanceDec])
 _ClassI
@@ -803,7 +793,6 @@
       remitter (TyVarI x y) = Just (x, y)
       remitter _ = Nothing
 
-#if MIN_VERSION_template_haskell(2,12,0)
 _PatSynI :: Prism' Info (Name, PatSynType)
 _PatSynI
   = prism' reviewer remitter
@@ -811,7 +800,6 @@
       reviewer (x, y) = PatSynI x y
       remitter (PatSynI x y) = Just (x, y)
       remitter _ = Nothing
-#endif
 
 _FunD :: Prism' Dec (Name, [Clause])
 _FunD
@@ -829,7 +817,7 @@
       remitter (ValD x y z) = Just (x, y, z)
       remitter _ = Nothing
 
-_TySynD :: Prism' Dec (Name, [TyVarBndr], Type)
+_TySynD :: Prism' Dec (Name, [TyVarBndrUnit], Type)
 _TySynD
   = prism' reviewer remitter
   where
@@ -837,7 +825,7 @@
       remitter (TySynD x y z) = Just (x, y, z)
       remitter _ = Nothing
 
-_ClassD :: Prism' Dec (Cxt, Name, [TyVarBndr], [FunDep], [Dec])
+_ClassD :: Prism' Dec (Cxt, Name, [TyVarBndrUnit], [FunDep], [Dec])
 _ClassD
   = prism' reviewer remitter
   where
@@ -944,12 +932,6 @@
       remitter (RoleAnnotD x y) = Just (x, y)
       remitter _ = Nothing
 
--- |
--- @
--- _StandaloneDerivD :: 'Prism'' 'Dec' ('Maybe' 'DerivStrategy', 'Cxt', 'Type') -- template-haskell 2.12+
--- _StandaloneDerivD :: 'Prism'' 'Dec' ('Cxt', 'Type')                      -- Earlier versions
--- @
-#if MIN_VERSION_template_haskell(2,12,0)
 _StandaloneDerivD :: Prism' Dec (Maybe DerivStrategy, Cxt, Type)
 _StandaloneDerivD
   = prism' reviewer remitter
@@ -957,15 +939,6 @@
       reviewer (x, y, z) = StandaloneDerivD x y z
       remitter (StandaloneDerivD x y z) = Just (x, y, z)
       remitter _ = Nothing
-#else
-_StandaloneDerivD :: Prism' Dec (Cxt, Type)
-_StandaloneDerivD
-  = prism' reviewer remitter
-  where
-      reviewer (x, y) = StandaloneDerivD x y
-      remitter (StandaloneDerivD x y) = Just (x, y)
-      remitter _ = Nothing
-#endif
 
 _DefaultSigD :: Prism' Dec (Name, Type)
 _DefaultSigD
@@ -983,20 +956,13 @@
       remitter (ClosedTypeFamilyD x y) = Just (x, y)
       remitter _ = Nothing
 
-#if MIN_VERSION_template_haskell(2,12,0)
-type DataPrism' tys cons = Prism' Dec (Cxt, Name, tys, Maybe Kind, cons, [DerivClause])
-#else
-type DataPrism' tys cons = Prism' Dec (Cxt, Name, tys, Maybe Kind, cons, Cxt)
-#endif
-
 -- |
 -- @
--- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Maybe' ['TyVarBndr'], 'Type', 'Maybe' 'Kind', ['Con'], ['DerivClause']) -- template-haskell-2.15+
--- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],            'Maybe' 'Kind', ['Con'], ['DerivClause']) -- template-haskell-2.12 through 2.14
--- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],            'Maybe' 'Kind', ['Con'], 'Cxt')           -- Earlier versions
+-- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Maybe' ['TyVarBndrUnit'], 'Type', 'Maybe' 'Kind', ['Con'], ['DerivClause']) -- template-haskell-2.15+
+-- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                'Maybe' 'Kind', ['Con'], ['DerivClause']) -- Earlier versions
  -- @
 #if MIN_VERSION_template_haskell(2,15,0)
-_DataInstD :: Prism' Dec (Cxt, Maybe [TyVarBndr], Type, Maybe Kind, [Con], [DerivClause])
+_DataInstD :: Prism' Dec (Cxt, Maybe [TyVarBndrUnit], Type, Maybe Kind, [Con], [DerivClause])
 _DataInstD
   = prism' reviewer remitter
   where
@@ -1004,7 +970,7 @@
       remitter (DataInstD x y z w u v) = Just (x, y, z, w, u, v)
       remitter _ = Nothing
 #else
-_DataInstD :: DataPrism' [Type] [Con]
+_DataInstD :: Prism' Dec (Cxt, Name, [Type], Maybe Kind, [Con], [DerivClause])
 _DataInstD
   = prism' reviewer remitter
   where
@@ -1015,12 +981,11 @@
 
 -- |
 -- @
--- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Maybe' ['TyVarBndr'], 'Type', 'Maybe' 'Kind', 'Con', ['DerivClause']) -- template-haskell-2.15+
--- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],            'Maybe' 'Kind', 'Con', ['DerivClause']) -- template-haskell-2.12 through 2.14
--- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],            'Maybe' 'Kind', 'Con', 'Cxt')           -- Earlier versions
+-- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Maybe' ['TyVarBndrUnit'], 'Type', 'Maybe' 'Kind', 'Con', ['DerivClause']) -- template-haskell-2.15+
+-- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                'Maybe' 'Kind', 'Con', ['DerivClause']) -- Eariler versions
 -- @
 #if MIN_VERSION_template_haskell(2,15,0)
-_NewtypeInstD :: Prism' Dec (Cxt, Maybe [TyVarBndr], Type, Maybe Kind, Con, [DerivClause])
+_NewtypeInstD :: Prism' Dec (Cxt, Maybe [TyVarBndrUnit], Type, Maybe Kind, Con, [DerivClause])
 _NewtypeInstD
   = prism' reviewer remitter
   where
@@ -1028,7 +993,7 @@
       remitter (NewtypeInstD x y z w u v) = Just (x, y, z, w, u, v)
       remitter _ = Nothing
 #else
-_NewtypeInstD :: DataPrism' [Type] Con
+_NewtypeInstD :: Prism' Dec (Cxt, Name, [Type], Maybe Kind, Con, [DerivClause])
 _NewtypeInstD
   = prism' reviewer remitter
   where
@@ -1037,12 +1002,7 @@
       remitter _ = Nothing
 #endif
 
--- |
--- @
--- _DataD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['TyVarBndr'], 'Maybe' 'Kind', ['Con'], ['DerivClause']) -- template-haskell-2.12+
--- _DataD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['TyVarBndr'], 'Maybe' 'Kind', ['Con'], 'Cxt')           -- Earlier versions
--- @
-_DataD :: DataPrism' [TyVarBndr] [Con]
+_DataD :: Prism' Dec (Cxt, Name, [TyVarBndrUnit], Maybe Kind, [Con], [DerivClause])
 _DataD
   = prism' reviewer remitter
   where
@@ -1050,12 +1010,7 @@
       remitter (DataD x y z w u v) = Just (x, y, z, w, u, v)
       remitter _ = Nothing
 
--- |
--- @
--- _NewtypeD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['TyVarBndr'], 'Maybe' 'Kind', 'Con', ['DerivClause']) -- template-haskell-2.12+
--- _NewtypeD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['TyVarBndr'], 'Maybe' 'Kind', 'Con', 'Cxt')           -- Earlier versions
--- @
-_NewtypeD :: DataPrism' [TyVarBndr] Con
+_NewtypeD :: Prism' Dec (Cxt, Name, [TyVarBndrUnit], Maybe Kind, Con, [DerivClause])
 _NewtypeD
   = prism' reviewer remitter
   where
@@ -1063,7 +1018,7 @@
       remitter (NewtypeD x y z w u v) = Just (x, y, z, w, u, v)
       remitter _ = Nothing
 
-_DataFamilyD :: Prism' Dec (Name, [TyVarBndr], Maybe Kind)
+_DataFamilyD :: Prism' Dec (Name, [TyVarBndrUnit], Maybe Kind)
 _DataFamilyD
   = prism' reviewer remitter
   where
@@ -1079,12 +1034,6 @@
       remitter (OpenTypeFamilyD x) = Just x
       remitter _ = Nothing
 
--- |
--- @
--- _PatSynD :: 'Prism'' 'Dec' ('Name', 'PatSynArgs', 'PatSynDir', 'Pat') -- template-haskell-2.12+
--- _PatSynD :: 'Prism'' 'Dec' ('Name', 'PatSynType')                 -- Earlier versions
--- @
-#if MIN_VERSION_template_haskell(2,12,0)
 _PatSynD :: Prism' Dec (Name, PatSynArgs, PatSynDir, Pat)
 _PatSynD
   = prism' reviewer remitter
@@ -1100,7 +1049,6 @@
       reviewer (x, y) = PatSynSigD x y
       remitter (PatSynSigD x y) = Just (x, y)
       remitter _ = Nothing
-#endif
 
 #if MIN_VERSION_template_haskell(2,15,0)
 _ImplicitParamBindD :: Prism' Dec (String, Exp)
@@ -1112,7 +1060,6 @@
       remitter _ = Nothing
 #endif
 
-#if MIN_VERSION_template_haskell(2,12,0)
 _Unidir :: Prism' PatSynDir ()
 _Unidir
   = prism' reviewer remitter
@@ -1160,7 +1107,6 @@
       reviewer = RecordPatSyn
       remitter (RecordPatSyn x) = Just x
       remitter _ = Nothing
-#endif
 
 _NormalC ::
   Prism' Con (Name, [BangType])
@@ -1188,7 +1134,7 @@
       remitter (InfixC x y z) = Just (x, y, z)
       remitter _ = Nothing
 
-_ForallC :: Prism' Con ([TyVarBndr], Cxt, Con)
+_ForallC :: Prism' Con ([TyVarBndrSpec], Cxt, Con)
 _ForallC
   = prism' reviewer remitter
   where
@@ -1390,11 +1336,11 @@
 
 -- |
 -- @
--- _RuleP :: 'Prism'' 'Pragma' ('String', 'Maybe' ['TyVarBndr'], ['RuleBndr'], 'Exp', 'Exp', 'Phases') -- template-haskell 2.15+:
--- _RuleP :: 'Prism'' 'Pragma' ('String', ['RuleBndr'], 'Exp', 'Exp', 'Phases')                    -- Earlier versions
+-- _RuleP :: 'Prism'' 'Pragma' ('String', 'Maybe' ['TyVarBndrUnit'], ['RuleBndr'], 'Exp', 'Exp', 'Phases') -- template-haskell 2.15+:
+-- _RuleP :: 'Prism'' 'Pragma' ('String', ['RuleBndr'], 'Exp', 'Exp', 'Phases')                        -- Earlier versions
 -- @
 #if MIN_VERSION_template_haskell(2,15,0)
-_RuleP :: Prism' Pragma (String, Maybe [TyVarBndr], [RuleBndr], Exp, Exp, Phases)
+_RuleP :: Prism' Pragma (String, Maybe [TyVarBndrUnit], [RuleBndr], Exp, Exp, Phases)
 _RuleP
   = prism' reviewer remitter
   where
@@ -1427,7 +1373,6 @@
       remitter (LineP x y) = Just (x, y)
       remitter _ = Nothing
 
-#if MIN_VERSION_template_haskell(2,12,0)
 _CompleteP :: Prism' Pragma ([Name], Maybe Name)
 _CompleteP
   = prism' reviewer remitter
@@ -1435,7 +1380,6 @@
       reviewer (x, y) = CompleteP x y
       remitter (CompleteP x y) = Just (x, y)
       remitter _ = Nothing
-#endif
 
 _NoInline :: Prism' Inline ()
 _NoInline
@@ -1655,7 +1599,6 @@
       remitter (AppE x y) = Just (x, y)
       remitter _ = Nothing
 
-#if MIN_VERSION_template_haskell(2,12,0)
 _AppTypeE :: Prism' Exp (Exp, Type)
 _AppTypeE
   = prism' reviewer remitter
@@ -1663,7 +1606,6 @@
       reviewer (x, y) = AppTypeE x y
       remitter (AppTypeE x y) = Just (x, y)
       remitter _ = Nothing
-#endif
 
 _InfixE :: Prism' Exp (Maybe Exp, Exp, Maybe Exp)
 _InfixE
@@ -1739,7 +1681,6 @@
       remitter (UnboxedTupE x) = Just x
       remitter _ = Nothing
 
-#if MIN_VERSION_template_haskell(2,12,0)
 _UnboxedSumE :: Prism' Exp (Exp, SumAlt, SumArity)
 _UnboxedSumE
   = prism' reviewer remitter
@@ -1747,7 +1688,6 @@
       reviewer (x, y, z) = UnboxedSumE x y z
       remitter (UnboxedSumE x y z) = Just (x, y, z)
       remitter _ = Nothing
-#endif
 
 _CondE :: Prism' Exp (Exp, Exp, Exp)
 _CondE
@@ -1781,6 +1721,20 @@
       remitter (CaseE x y) = Just (x, y)
       remitter _ = Nothing
 
+-- |
+-- @
+-- _DoE :: 'Prism'' 'Exp' ('Maybe' 'ModName', ['Stmt']) -- template-haskell-2.17+
+-- _DoE :: 'Prism'' 'Exp' ['Stmt']                  -- Earlier versions
+-- @
+#if MIN_VERSION_template_haskell(2,17,0)
+_DoE :: Prism' Exp (Maybe ModName, [Stmt])
+_DoE
+  = prism' reviewer remitter
+  where
+      reviewer (x, y) = DoE x y
+      remitter (DoE x y) = Just (x, y)
+      remitter _ = Nothing
+#else
 _DoE :: Prism' Exp [Stmt]
 _DoE
   = prism' reviewer remitter
@@ -1788,6 +1742,7 @@
       reviewer = DoE
       remitter (DoE x) = Just x
       remitter _ = Nothing
+#endif
 
 _CompE :: Prism' Exp [Stmt]
 _CompE
@@ -1864,6 +1819,21 @@
 #endif
 
 #if MIN_VERSION_template_haskell(2,15,0)
+
+-- |
+-- @
+-- _MDoE :: 'Prism'' 'Exp' ('Maybe' 'ModName', ['Stmt']) -- template-haskell-2.17+
+-- _MDoE :: 'Prism'' 'Exp' ['Stmt']                  -- Earlier versions
+-- @
+#if MIN_VERSION_template_haskell(2,17,0)
+_MDoE :: Prism' Exp (Maybe ModName, [Stmt])
+_MDoE
+  = prism' reviewer remitter
+  where
+      reviewer (x, y) = MDoE x y
+      remitter (MDoE x y) = Just (x, y)
+      remitter _ = Nothing
+#else
 _MDoE :: Prism' Exp [Stmt]
 _MDoE
   = prism' reviewer remitter
@@ -1871,6 +1841,7 @@
       reviewer = MDoE
       remitter (MDoE x) = Just x
       remitter _ = Nothing
+#endif
 
 _ImplicitParamVarE :: Prism' Exp String
 _ImplicitParamVarE
@@ -2109,7 +2080,6 @@
       remitter (UnboxedTupP x) = Just x
       remitter _ = Nothing
 
-#if MIN_VERSION_template_haskell(2,12,0)
 _UnboxedSumP :: Prism' Pat (Pat, SumAlt, SumArity)
 _UnboxedSumP
   = prism' reviewer remitter
@@ -2117,8 +2087,21 @@
       reviewer (x, y, z) = UnboxedSumP x y z
       remitter (UnboxedSumP x y z) = Just (x, y, z)
       remitter _ = Nothing
-#endif
 
+-- |
+-- @
+-- _ConP :: 'Prism'' 'Pat' ('Name', ['Type'], 'Pat') -- template-haskell-2.18+
+-- _ConP :: 'Prism'' 'Pat' ('Name',         'Pat') -- Earlier versions
+-- @
+#if MIN_VERSION_template_haskell(2,18,0)
+_ConP :: Prism' Pat (Name, [Type], [Pat])
+_ConP
+  = prism' reviewer remitter
+  where
+      reviewer (x, y, z) = ConP x y z
+      remitter (ConP x y z) = Just (x, y, z)
+      remitter _ = Nothing
+#else
 _ConP :: Prism' Pat (Name, [Pat])
 _ConP
   = prism' reviewer remitter
@@ -2126,6 +2109,7 @@
       reviewer (x, y) = ConP x y
       remitter (ConP x y) = Just (x, y)
       remitter _ = Nothing
+#endif
 
 _InfixP :: Prism' Pat (Pat, Name, Pat)
 _InfixP
@@ -2215,7 +2199,7 @@
       remitter (ViewP x y) = Just (x, y)
       remitter _ = Nothing
 
-_ForallT :: Prism' Type ([TyVarBndr], Cxt, Type)
+_ForallT :: Prism' Type ([TyVarBndrSpec], Cxt, Type)
 _ForallT
   = prism' reviewer remitter
   where
@@ -2279,7 +2263,6 @@
       remitter (UnboxedTupleT x) = Just x
       remitter _ = Nothing
 
-#if MIN_VERSION_template_haskell(2,12,0)
 _UnboxedSumT :: Prism' Type SumArity
 _UnboxedSumT
   = prism' reviewer remitter
@@ -2287,7 +2270,6 @@
       reviewer = UnboxedSumT
       remitter (UnboxedSumT x) = Just x
       remitter _ = Nothing
-#endif
 
 _ArrowT :: Prism' Type ()
 _ArrowT
@@ -2412,7 +2394,7 @@
 #endif
 
 #if MIN_VERSION_template_haskell(2,16,0)
-_ForallVisT :: Prism' Type ([TyVarBndr], Type)
+_ForallVisT :: Prism' Type ([TyVarBndrUnit], Type)
 _ForallVisT
   = prism' reviewer remitter
   where
@@ -2421,6 +2403,46 @@
       remitter _ = Nothing
 #endif
 
+#if MIN_VERSION_template_haskell(2,17,0)
+_MulArrowT :: Prism' Type ()
+_MulArrowT
+  = prism' reviewer remitter
+  where
+      reviewer () = MulArrowT
+      remitter MulArrowT = Just ()
+      remitter _ = Nothing
+
+_SpecifiedSpec :: Prism' Specificity ()
+_SpecifiedSpec
+  = prism' reviewer remitter
+  where
+      reviewer () = SpecifiedSpec
+      remitter SpecifiedSpec = Just ()
+      remitter _ = Nothing
+
+_InferredSpec :: Prism' Specificity ()
+_InferredSpec
+  = prism' reviewer remitter
+  where
+      reviewer () = InferredSpec
+      remitter InferredSpec = Just ()
+      remitter _ = Nothing
+#endif
+
+-- |
+-- @
+-- _PlainTV :: 'Prism'' ('TyVarBndr' flag) ('Name', flag) -- template-haskell-2.17+
+-- _PlainTV :: 'Prism''  'TyVarBndr'        'Name'        -- Earlier versions
+-- @
+#if MIN_VERSION_template_haskell(2,17,0)
+_PlainTV :: Prism' (TyVarBndr flag) (Name, flag)
+_PlainTV
+  = prism' reviewer remitter
+  where
+      reviewer (x, y) = PlainTV x y
+      remitter (PlainTV x y) = Just (x, y)
+      remitter _ = Nothing
+#else
 _PlainTV :: Prism' TyVarBndr Name
 _PlainTV
   = prism' reviewer remitter
@@ -2428,7 +2450,22 @@
       reviewer = PlainTV
       remitter (PlainTV x) = Just x
       remitter _ = Nothing
+#endif
 
+-- |
+-- @
+-- _KindedTV :: 'Prism'' ('TyVarBndr' flag) ('Name', flag, 'Kind') -- template-haskell-2.17+
+-- _KindedTV :: 'Prism''  'TyVarBndr'       ('Name',       'Kind') -- Earlier versions
+-- @
+#if MIN_VERSION_template_haskell(2,17,0)
+_KindedTV :: Prism' (TyVarBndr flag) (Name, flag, Kind)
+_KindedTV
+  = prism' reviewer remitter
+  where
+      reviewer (x, y, z) = KindedTV x y z
+      remitter (KindedTV x y z) = Just (x, y, z)
+      remitter _ = Nothing
+#else
 _KindedTV :: Prism' TyVarBndr (Name, Kind)
 _KindedTV
   = prism' reviewer remitter
@@ -2436,6 +2473,7 @@
       reviewer (x, y) = KindedTV x y
       remitter (KindedTV x y) = Just (x, y)
       remitter _ = Nothing
+#endif
 
 _NoSig :: Prism' FamilyResultSig ()
 _NoSig
@@ -2453,7 +2491,7 @@
       remitter (KindSig x) = Just x
       remitter _ = Nothing
 
-_TyVarSig :: Prism' FamilyResultSig TyVarBndr
+_TyVarSig :: Prism' FamilyResultSig TyVarBndrUnit
 _TyVarSig
   = prism' reviewer remitter
   where
@@ -2477,6 +2515,16 @@
       remitter (StrTyLit x) = Just x
       remitter _ = Nothing
 
+#if MIN_VERSION_template_haskell(2,18,0)
+_CharTyLit :: Prism' TyLit Char
+_CharTyLit
+  = prism' reviewer remitter
+  where
+      reviewer = CharTyLit
+      remitter (CharTyLit x) = Just x
+      remitter _ = Nothing
+#endif
+
 _NominalR :: Prism' Role ()
 _NominalR
   = prism' reviewer remitter
@@ -2509,7 +2557,6 @@
       remitter InferR = Just ()
       remitter _ = Nothing
 
-#if MIN_VERSION_template_haskell(2,12,0)
 _StockStrategy :: Prism' DerivStrategy ()
 _StockStrategy
   = prism' reviewer remitter
@@ -2533,7 +2580,6 @@
       reviewer () = NewtypeStrategy
       remitter NewtypeStrategy = Just ()
       remitter _ = Nothing
-#endif
 
 -- Internal utils
 
diff --git a/template-haskell-optics.cabal b/template-haskell-optics.cabal
--- a/template-haskell-optics.cabal
+++ b/template-haskell-optics.cabal
@@ -1,12 +1,13 @@
 name:          template-haskell-optics
-version:       0.1
+version:       0.2
 license:       BSD3
 license-file:  LICENSE
 build-type:    Simple
 maintainer:    optics@well-typed.com
 author:        Andrzej Rybczak
-cabal-version: >=1.10
-tested-with:   ghc ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.2, GHCJS ==8.4
+cabal-version: 1.18
+tested-with:   GHC ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7
+                || ==9.0.2 || ==9.2.2, GHCJS ==8.4
 synopsis:      Optics for template-haskell types
 category:      Data, Optics, Lenses
 description:
@@ -14,6 +15,9 @@
   .
   See the @optics-th@ package for machinery to construct optics using @TemplateHaskell@.
 
+extra-doc-files:
+  CHANGELOG.md
+
 bug-reports:   https://github.com/well-typed/optics/issues
 source-repository head
   type:     git
@@ -25,9 +29,10 @@
   hs-source-dirs:   src
   ghc-options:      -Wall
 
-  build-depends: base                   >= 4.9       && <5
-               , optics-core            >= 0.3       && <0.4
-               , containers             >= 0.5.7.1   && <0.7
-               , template-haskell       >= 2.11      && <2.17
+  build-depends: base                   >= 4.10      && <5
+               , optics-core            >= 0.4       && <0.5
+               , containers             >= 0.5.10.2  && <0.7
+               , template-haskell       >= 2.12      && <2.19
+               , th-abstraction         >= 0.4       && <0.5
 
   exposed-modules: Language.Haskell.TH.Optics
