diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # ChangeLog for shakespeare
 
+### 2.0.25
+
+* Support for GHC 9.0 [#254](https://github.com/yesodweb/shakespeare/pull/254)
+
 ### 2.0.24.1
 
 * Derive Lift instances wherever possible [#252](https://github.com/yesodweb/shakespeare/pull/252)
diff --git a/Text/Hamlet.hs b/Text/Hamlet.hs
--- a/Text/Hamlet.hs
+++ b/Text/Hamlet.hs
@@ -110,7 +110,11 @@
     case exps of
         [] -> [|return ()|]
         [x] -> return x
-        _ -> return $ DoE $ map NoBindS exps
+        _ -> return $ DoE
+#if MIN_VERSION_template_haskell(2,17,0)
+                Nothing
+#endif
+                $ map NoBindS exps
 
 unIdent :: Ident -> String
 unIdent (Ident s) = s
diff --git a/Text/Hamlet/Parse.hs b/Text/Hamlet/Parse.hs
--- a/Text/Hamlet/Parse.hs
+++ b/Text/Hamlet/Parse.hs
@@ -625,7 +625,9 @@
 
 instance Lift (String -> CloseStyle) where
     lift _ = [|\s -> htmlCloseStyle s|]
-#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
 #endif
 
diff --git a/Text/Internal/Css.hs b/Text/Internal/Css.hs
--- a/Text/Internal/Css.hs
+++ b/Text/Internal/Css.hs
@@ -270,7 +270,7 @@
       where
         cs = either error mconcat $ mapM (contentToBuilderRT cd render') cs'
     goTop scope (TopBlock b:rest) =
-        map TopBlock (either error ($[]) $ blockRuntime (addScope scope) render' b) ++
+        map TopBlock (either error ($ []) $ blockRuntime (addScope scope) render' b) ++
         goTop scope rest
     goTop scope (TopAtBlock name s' b:rest) =
         TopAtBlock name s (foldr (either error id . blockRuntime (addScope scope) render') [] b) :
@@ -516,16 +516,24 @@
 deriving instance Lift (Attr Unresolved)
 instance Lift (Attr Resolved) where
     lift (Attr k v) = [|Attr $(liftBuilder k) $(liftBuilder v) :: Attr Resolved |]
-#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
 #endif
 
+#if MIN_VERSION_template_haskell(2,17,0)
+liftBuilder :: Quote m => Builder -> m Exp
+#else
 liftBuilder :: Builder -> Q Exp
+#endif
 liftBuilder b = [|fromText $ pack $(lift $ TL.unpack $ toLazyText b)|]
 
 deriving instance Lift (Block Unresolved)
 instance Lift (Block Resolved) where
     lift (Block a b () ()) = [|Block $(liftBuilder a) b () ()|]
-#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
 #endif
diff --git a/Text/Lucius.hs b/Text/Lucius.hs
--- a/Text/Lucius.hs
+++ b/Text/Lucius.hs
@@ -334,7 +334,7 @@
             -> Block Unresolved
             -> Either String [Block Resolved]
     goBlock scope =
-        either Left (Right . ($[])) . blockRuntime scope' (error "luciusRT has no URLs")
+        either Left (Right . ($ [])) . blockRuntime scope' (error "luciusRT has no URLs")
       where
         scope' = map goScope scope
 
diff --git a/Text/Shakespeare.hs b/Text/Shakespeare.hs
--- a/Text/Shakespeare.hs
+++ b/Text/Shakespeare.hs
@@ -152,7 +152,9 @@
         liftExp _ = error "liftExp only supports VarE and ConE"
         liftMExp Nothing = [|Nothing|]
         liftMExp (Just e) = [|Just|] `appE` liftExp e
-#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
 #endif
 
diff --git a/shakespeare.cabal b/shakespeare.cabal
--- a/shakespeare.cabal
+++ b/shakespeare.cabal
@@ -1,5 +1,5 @@
 name:            shakespeare
-version:         2.0.24.1
+version:         2.0.25
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
