diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,4 +1,8 @@
-# Revision history for dependent-sum
+# Revision history for dependent-sum-template
+
+## 0.1.1.0 - 2021-11-25
+
+* Support GHC 9.0
 
 ## 0.1.0.3 - 2020-03-24
 
diff --git a/dependent-sum-template.cabal b/dependent-sum-template.cabal
--- a/dependent-sum-template.cabal
+++ b/dependent-sum-template.cabal
@@ -1,12 +1,12 @@
 name:                   dependent-sum-template
-version:                0.1.0.3
+version:                0.1.1.0
 stability:              experimental
 
-cabal-version:          >= 1.8
+cabal-version:          >= 1.10
 build-type:             Simple
 
 author:                 James Cook <mokus@deepbondi.net>
-maintainer:             Ryan Trinkle <ryan.trinkle@obsidian.systems>
+maintainer:             Obsidian Systems, LLC <maintainer@obsidian.systems>
 license:                PublicDomain
 homepage:               https://github.com/obsidiansystems/dependent-sum
 
@@ -18,7 +18,8 @@
                         GHC == 8.2.2,
                         GHC == 8.4.4,
                         GHC == 8.6.5,
-                        GHC == 8.8.3
+                        GHC == 8.8.3,
+                        GHC == 9.0.1
 
 extra-source-files:     ChangeLog.md
 
@@ -30,19 +31,22 @@
   if impl(ghc < 7.10)
     buildable: False
   hs-source-dirs:       src
+  default-language:     Haskell2010
   exposed-modules:      Data.GADT.Compare.TH
                         Data.GADT.Show.TH
   other-modules:        Data.Dependent.Sum.TH.Internal
   build-depends:        base >= 3 && <5,
                         dependent-sum >= 0.4.1 && < 0.8,
                         template-haskell,
-                        th-extras >= 0.0.0.2
+                        th-extras >= 0.0.0.2,
+                        th-abstraction
 
 test-suite test
   if impl(ghc < 8.0)
     buildable: False
   type: exitcode-stdio-1.0
   hs-source-dirs: test
+  default-language:     Haskell2010
   main-is: test.hs
   build-depends: base
                , constraints-extras
diff --git a/src/Data/Dependent/Sum/TH/Internal.hs b/src/Data/Dependent/Sum/TH/Internal.hs
--- a/src/Data/Dependent/Sum/TH/Internal.hs
+++ b/src/Data/Dependent/Sum/TH/Internal.hs
@@ -10,6 +10,7 @@
 import Control.Monad
 import Language.Haskell.TH
 import Language.Haskell.TH.Extras
+import Language.Haskell.TH.Datatype.TyVarBndr
 
 classHeadToParams :: Type -> (Name, [Type])
 classHeadToParams t = (h, reverse reversedParams)
@@ -24,8 +25,11 @@
 -- Invoke the deriver for the given class instance.  We assume that the type
 -- we're deriving for is always the first typeclass parameter, if there are
 -- multiple.
-deriveForDec :: Name -> (Q Type -> Q Type) -> ([TyVarBndr] -> [Con] -> Q Dec) -> Dec -> Q [Dec]
-deriveForDec className _ f (InstanceD overlaps cxt classHead decs) = do
+deriveForDec :: Name -> (Q Type -> Q Type) -> ([TyVarBndrSpec] -> [Con] -> Q Dec) -> Dec -> Q [Dec]
+deriveForDec className makeClassHead f dec = deriveForDec' className makeClassHead (f . changeTVFlags specifiedSpec) dec
+
+deriveForDec' :: Name -> (Q Type -> Q Type) -> ([TyVarBndrUnit] -> [Con] -> Q Dec) -> Dec -> Q [Dec]
+deriveForDec' className _ f (InstanceD overlaps cxt classHead decs) = do
     let (givenClassName, firstParam : _) = classHeadToParams classHead
     when (givenClassName /= className) $
       fail $ "while deriving " ++ show className ++ ": wrong class name in prototype declaration: " ++ show givenClassName
@@ -36,20 +40,24 @@
             dec <- f bndrs cons
             return [InstanceD overlaps cxt classHead [dec]]
         _ -> fail $ "while deriving " ++ show className ++ ": the name of an algebraic data type constructor is required"
-deriveForDec className makeClassHead f (DataD dataCxt name bndrs _ cons _) = return <$> inst
+deriveForDec' className makeClassHead f (DataD dataCxt name bndrs _ cons _) = return <$> inst
     where
         inst = instanceD (cxt (map return dataCxt)) (makeClassHead $ conT name) [dec]
         dec = f bndrs cons
 #if __GLASGOW_HASKELL__ >= 808
-deriveForDec className makeClassHead f (DataInstD dataCxt tvBndrs ty _ cons _) = return <$> inst
+deriveForDec' className makeClassHead f (DataInstD dataCxt tvBndrs ty _ cons _) = return <$> inst
 #else
-deriveForDec className makeClassHead f (DataInstD dataCxt name tyArgs _ cons _) = return <$> inst
+deriveForDec' className makeClassHead f (DataInstD dataCxt name tyArgs _ cons _) = return <$> inst
 #endif
     where
         inst = instanceD (cxt (map return dataCxt)) clhead [dec]
 #if __GLASGOW_HASKELL__ >= 808
         clhead = makeClassHead $ return $ initTy ty
+#if __GLASGOW_HASKELL__ >= 900
+        bndrs = [PlainTV v x | PlainTV v x <- maybe [] id tvBndrs]
+#else
         bndrs = [PlainTV v | PlainTV v <- maybe [] id tvBndrs]
+#endif
         initTy (AppT ty _) = ty
 #else
         clhead = makeClassHead $ foldl1 appT (map return $ (ConT name : init tyArgs))
diff --git a/test/test.hs b/test/test.hs
--- a/test/test.hs
+++ b/test/test.hs
@@ -96,23 +96,22 @@
 
 deriveGEq ''Foo
 deriveGEq ''Bar
-deriveGEq ''Baz
 deriveGEq ''Qux
+deriveGEq ''Baz
 
 deriveGCompare ''Foo
 deriveGCompare ''Bar
-deriveGCompare ''Baz
 deriveGCompare ''Qux
+deriveGCompare ''Baz
 
+deriveGShow ''Foo
 instance Show (Foo a) where showsPrec = gshowsPrec
+deriveGShow ''Bar
 instance Show (Bar a) where showsPrec = gshowsPrec
-instance Show (Baz a) where showsPrec = gshowsPrec
+deriveGShow ''Qux
 instance Show (Qux a) where showsPrec = gshowsPrec
-
-deriveGShow ''Foo
-deriveGShow ''Bar
 deriveGShow ''Baz
-deriveGShow ''Qux
+instance Show (Baz a) where showsPrec = gshowsPrec
 
 data Squudge a where
     E :: Ord a => Foo a -> Squudge a
