diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## Modern URI 0.3.4.1
+
+* Works with GHC 9.0.1.
+
 ## Modern URI 0.3.4.0
 
 * URIs with authority component and without path are now rendered without
diff --git a/Text/URI.hs b/Text/URI.hs
--- a/Text/URI.hs
+++ b/Text/URI.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TupleSections #-}
@@ -78,10 +77,6 @@
 import Text.URI.Parser.Text
 import Text.URI.Render
 import Text.URI.Types
-
-#if !MIN_VERSION_base(4,13,0)
-import Data.Semigroup ((<>))
-#endif
 
 -- | The empty 'URI'.
 --
diff --git a/Text/URI/Types.hs b/Text/URI/Types.hs
--- a/Text/URI/Types.hs
+++ b/Text/URI/Types.hs
@@ -126,7 +126,9 @@
 instance TH.Lift URI where
   lift = liftData
 
-#if MIN_VERSION_template_haskell(2,16,0)
+#if MIN_VERSION_template_haskell(2,17,0)
+  liftTyped = TH.Code . TH.unsafeTExpCoerce . TH.lift
+#elif MIN_VERSION_template_haskell(2,16,0)
   liftTyped = TH.unsafeTExpCoerce . TH.lift
 #endif
 
@@ -169,7 +171,9 @@
 instance TH.Lift Authority where
   lift = liftData
 
-#if MIN_VERSION_template_haskell(2,16,0)
+#if MIN_VERSION_template_haskell(2,17,0)
+  liftTyped = TH.Code . TH.unsafeTExpCoerce . TH.lift
+#elif MIN_VERSION_template_haskell(2,16,0)
   liftTyped = TH.unsafeTExpCoerce . TH.lift
 #endif
 
@@ -195,7 +199,9 @@
 instance TH.Lift UserInfo where
   lift = liftData
 
-#if MIN_VERSION_template_haskell(2,16,0)
+#if MIN_VERSION_template_haskell(2,17,0)
+  liftTyped = TH.Code . TH.unsafeTExpCoerce . TH.lift
+#elif MIN_VERSION_template_haskell(2,16,0)
   liftTyped = TH.unsafeTExpCoerce . TH.lift
 #endif
 
@@ -221,7 +227,9 @@
 instance TH.Lift QueryParam where
   lift = liftData
 
-#if MIN_VERSION_template_haskell(2,16,0)
+#if MIN_VERSION_template_haskell(2,17,0)
+  liftTyped = TH.Code . TH.unsafeTExpCoerce . TH.lift
+#elif MIN_VERSION_template_haskell(2,16,0)
   liftTyped = TH.unsafeTExpCoerce . TH.lift
 #endif
 
@@ -267,7 +275,9 @@
 instance Typeable l => TH.Lift (RText l) where
   lift = liftData
 
-#if MIN_VERSION_template_haskell(2,16,0)
+#if MIN_VERSION_template_haskell(2,17,0)
+  liftTyped = TH.Code . TH.unsafeTExpCoerce . TH.lift
+#elif MIN_VERSION_template_haskell(2,16,0)
   liftTyped = TH.unsafeTExpCoerce . TH.lift
 #endif
 
@@ -548,8 +558,20 @@
 ----------------------------------------------------------------------------
 -- TH lifting helpers
 
-liftData :: Data a => a -> TH.Q TH.Exp
+liftData
+
+#if MIN_VERSION_template_haskell(2,17,0)
+  :: (Data a, TH.Quote m) => a -> m TH.Exp
+#else
+  :: Data a => a -> TH.Q TH.Exp
+#endif
 liftData = TH.dataToExpQ (fmap liftText . cast)
 
-liftText :: Text -> TH.Q TH.Exp
+liftText
+
+#if MIN_VERSION_template_haskell(2,17,0)
+  :: TH.Quote m => Text -> m TH.Exp
+#else
+  :: Text -> TH.Q TH.Exp
+#endif
 liftText t = TH.AppE (TH.VarE 'T.pack) <$> TH.lift (T.unpack t)
diff --git a/modern-uri.cabal b/modern-uri.cabal
--- a/modern-uri.cabal
+++ b/modern-uri.cabal
@@ -1,11 +1,11 @@
 cabal-version:   1.18
 name:            modern-uri
-version:         0.3.4.0
+version:         0.3.4.1
 license:         BSD3
 license-file:    LICENSE.md
 maintainer:      Mark Karpov <markkarpov92@gmail.com>
 author:          Mark Karpov <markkarpov92@gmail.com>
-tested-with:     ghc ==8.6.5 ghc ==8.8.4 ghc ==8.10.3
+tested-with:     ghc ==8.6.5 ghc ==8.8.4 ghc ==8.10.4 ghc ==9.0.1
 homepage:        https://github.com/mrkkrp/modern-uri
 bug-reports:     https://github.com/mrkkrp/modern-uri/issues
 synopsis:        Modern library for working with URIs
@@ -41,7 +41,7 @@
     default-language: Haskell2010
     build-depends:
         QuickCheck >=2.4 && <3.0,
-        base >=4.12 && <5.0,
+        base >=4.13 && <5.0,
         bytestring >=0.2 && <0.12,
         containers >=0.5 && <0.7,
         contravariant >=1.3 && <2.0,
@@ -52,7 +52,7 @@
         profunctors >=5.2.1 && <6.0,
         reflection >=2.0 && <3.0,
         tagged >=0.8 && <0.9,
-        template-haskell >=2.10 && <2.17,
+        template-haskell >=2.10 && <2.18,
         text >=0.2 && <1.3
 
     if flag(dev)
@@ -78,7 +78,7 @@
     default-language: Haskell2010
     build-depends:
         QuickCheck >=2.4 && <3.0,
-        base >=4.12 && <5.0,
+        base >=4.13 && <5.0,
         bytestring >=0.2 && <0.12,
         hspec >=2.0 && <3.0,
         hspec-megaparsec >=2.0 && <3.0,
@@ -98,7 +98,7 @@
     hs-source-dirs:   bench/speed
     default-language: Haskell2010
     build-depends:
-        base >=4.12 && <5.0,
+        base >=4.13 && <5.0,
         bytestring >=0.2 && <0.12,
         criterion >=0.6.2.1 && <1.6,
         megaparsec >=7.0 && <10.0,
@@ -117,7 +117,7 @@
     hs-source-dirs:   bench/memory
     default-language: Haskell2010
     build-depends:
-        base >=4.12 && <5.0,
+        base >=4.13 && <5.0,
         bytestring >=0.2 && <0.12,
         deepseq >=1.3 && <1.5,
         megaparsec >=7.0 && <10.0,
diff --git a/tests/Text/URISpec.hs b/tests/Text/URISpec.hs
--- a/tests/Text/URISpec.hs
+++ b/tests/Text/URISpec.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
@@ -19,10 +18,6 @@
 import Text.Megaparsec
 import Text.URI (RTextException (..), RTextLabel (..), URI (..))
 import qualified Text.URI as URI
-
-#if !MIN_VERSION_base(4,13,0)
-import Data.Semigroup ((<>))
-#endif
 
 instance Arbitrary Text where
   arbitrary = T.pack <$> arbitrary
