diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# hpqtypes-1.9.1.1 (2021-05-27)
+* Support GHC 9.0.
+
 # hpqtypes-1.9.1.0 (2020-09-14)
 * Expose aesonFromSQL and aesonToSQL for convenience.
 
diff --git a/hpqtypes.cabal b/hpqtypes.cabal
--- a/hpqtypes.cabal
+++ b/hpqtypes.cabal
@@ -1,5 +1,5 @@
 name:                hpqtypes
-version:             1.9.1.0
+version:             1.9.1.1
 synopsis:            Haskell bindings to libpqtypes
 
 description:         Efficient and easy-to-use bindings to (slightly modified)
@@ -39,7 +39,8 @@
 category:            Database
 build-type:          Custom
 cabal-version:       1.24
-tested-with:         GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.2
+tested-with:         GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.4
+                      || ==9.0.1
 
 
 extra-source-files: README.md
@@ -71,7 +72,7 @@
 
 custom-setup
   setup-depends: base  >= 4.9  && < 5,
-                 Cabal >= 1.24 && < 3.3,
+                 Cabal >= 1.24 && < 3.6,
                  directory,
                  filepath
 
diff --git a/src/Database/PostgreSQL/PQTypes/Composite.hs b/src/Database/PostgreSQL/PQTypes/Composite.hs
--- a/src/Database/PostgreSQL/PQTypes/Composite.hs
+++ b/src/Database/PostgreSQL/PQTypes/Composite.hs
@@ -7,6 +7,7 @@
   , CompositeToSQL(..)
   ) where
 
+import Data.Kind (Type)
 import Foreign.Ptr
 import qualified Control.Exception as E
 
@@ -34,7 +35,7 @@
 -- As an example, consider the type defined as (a INTEGER, b DATE).
 -- Then its CompositeRow instance could be (Maybe Int32, Maybe Day),
 -- (Maybe Int32, Day), (Int32, Maybe Day) or (Int32, Day).
-type family CompositeRow t :: *
+type family CompositeRow t :: Type
 
 -- | Class which represents \"from SQL to composite\" transformation.
 class (PQFormat t, FromRow (CompositeRow t)) => CompositeFromSQL t where
diff --git a/src/Database/PostgreSQL/PQTypes/Cursor.hs b/src/Database/PostgreSQL/PQTypes/Cursor.hs
--- a/src/Database/PostgreSQL/PQTypes/Cursor.hs
+++ b/src/Database/PostgreSQL/PQTypes/Cursor.hs
@@ -43,10 +43,11 @@
   deriving (Eq, Ord, Show)
 
 -- | Defines whether a cursor will be declared as @WITH HOLD@ or @WITHOUT HOLD@.
--- Cursors declared as @WITH HOLD@ can only be declared within a transaction
--- block and they're automatically closed once the transaction finishes,
--- otherwise they're independent of the current transaction and can be declared
--- even if no transaction is active.
+--
+-- From the PostgreSQL manual: WITH HOLD specifies that the cursor can continue
+-- to be used after the transaction that created it successfully commits.
+-- WITHOUT HOLD specifies that the cursor cannot be used outside of the
+-- transaction that created it.
 data Hold = Hold | NoHold
   deriving (Eq, Ord, Show)
 
diff --git a/src/Database/PostgreSQL/PQTypes/FromSQL.hs b/src/Database/PostgreSQL/PQTypes/FromSQL.hs
--- a/src/Database/PostgreSQL/PQTypes/FromSQL.hs
+++ b/src/Database/PostgreSQL/PQTypes/FromSQL.hs
@@ -3,6 +3,7 @@
   ) where
 
 import Data.Int
+import Data.Kind (Type)
 import Data.Ratio
 import Data.Text.Encoding
 import Data.Time
@@ -24,7 +25,7 @@
 -- type to Haskell type\" transformation.
 class (PQFormat t, Storable (PQBase t)) => FromSQL t where
   -- | Base type (used by libpqtypes).
-  type PQBase t :: *
+  type PQBase t :: Type
   -- | Convert value of base type to target one.
   fromSQL :: Maybe (PQBase t) -- ^ base value (Nothing if NULL was delivered)
           -> IO t
diff --git a/src/Database/PostgreSQL/PQTypes/Internal/Connection.hs b/src/Database/PostgreSQL/PQTypes/Internal/Connection.hs
--- a/src/Database/PostgreSQL/PQTypes/Internal/Connection.hs
+++ b/src/Database/PostgreSQL/PQTypes/Internal/Connection.hs
@@ -20,6 +20,7 @@
 import Control.Monad.Base
 import Control.Monad.Catch
 import Data.Function
+import Data.Kind (Type)
 import Data.Pool
 import Data.Time.Clock
 import Foreign.C.String
@@ -114,7 +115,7 @@
 }
 
 -- | Wrapper for a polymorphic connection source.
-newtype ConnectionSource (cs :: [(* -> *) -> Constraint]) = ConnectionSource {
+newtype ConnectionSource (cs :: [(Type -> Type) -> Constraint]) = ConnectionSource {
   unConnectionSource :: forall m. MkConstraint m cs => ConnectionSourceM m
 }
 
diff --git a/src/Database/PostgreSQL/PQTypes/Internal/Monad.hs b/src/Database/PostgreSQL/PQTypes/Internal/Monad.hs
--- a/src/Database/PostgreSQL/PQTypes/Internal/Monad.hs
+++ b/src/Database/PostgreSQL/PQTypes/Internal/Monad.hs
@@ -82,7 +82,7 @@
       Nothing -> throwDB $ HPQTypesError "getConnectionStats: no connection"
       Just cd -> return $ cdStats cd
 
-  getQueryResult = DBT . gets $ dbQueryResult
+  getQueryResult = DBT . gets $ \st -> dbQueryResult st
   clearQueryResult = DBT . modify $ \st -> st { dbQueryResult = Nothing }
 
   getTransactionSettings = DBT . gets $ dbTransactionSettings
diff --git a/src/Database/PostgreSQL/PQTypes/Internal/Utils.hs b/src/Database/PostgreSQL/PQTypes/Internal/Utils.hs
--- a/src/Database/PostgreSQL/PQTypes/Internal/Utils.hs
+++ b/src/Database/PostgreSQL/PQTypes/Internal/Utils.hs
@@ -17,6 +17,7 @@
 
 import Control.Monad
 import Data.ByteString.Unsafe
+import Data.Kind (Type)
 import Foreign.C
 import Foreign.ForeignPtr
 import Foreign.Marshal.Alloc
@@ -32,7 +33,8 @@
 import Database.PostgreSQL.PQTypes.Internal.C.Types
 import Database.PostgreSQL.PQTypes.Internal.Error
 
-type family MkConstraint (m :: * -> *) (cs :: [(* -> *) -> Constraint]) :: Constraint where
+type family MkConstraint (m :: Type -> Type)
+                         (cs :: [(Type -> Type) -> Constraint]) :: Constraint where
   MkConstraint m '[] = ()
   MkConstraint m (c ': cs) = (c m, MkConstraint m cs)
 
diff --git a/src/Database/PostgreSQL/PQTypes/SQL.hs b/src/Database/PostgreSQL/PQTypes/SQL.hs
--- a/src/Database/PostgreSQL/PQTypes/SQL.hs
+++ b/src/Database/PostgreSQL/PQTypes/SQL.hs
@@ -73,7 +73,7 @@
 
 ----------------------------------------
 
--- | Convert 'ByteString' to 'SQL'.
+-- | Convert a 'Text' SQL string to the 'SQL' type.
 mkSQL :: T.Text -> SQL
 mkSQL = SQL . S.singleton . SqlString
 
diff --git a/src/Database/PostgreSQL/PQTypes/ToSQL.hs b/src/Database/PostgreSQL/PQTypes/ToSQL.hs
--- a/src/Database/PostgreSQL/PQTypes/ToSQL.hs
+++ b/src/Database/PostgreSQL/PQTypes/ToSQL.hs
@@ -6,6 +6,7 @@
 
 import Data.ByteString.Unsafe
 import Data.Int
+import Data.Kind (Type)
 import Data.Text.Encoding
 import Data.Time
 import Data.Word
@@ -31,7 +32,7 @@
 -- to SQL (libpqtypes) type\" transformation.
 class PQFormat t => ToSQL t where
   -- | Destination type (used by libpqtypes).
-  type PQDest t :: *
+  type PQDest t :: Type
   -- | Put supplied value into inner 'PGparam'.
   toSQL :: t -- ^ Value to be put.
         -> ParamAllocator -- ^ 'PGparam' allocator.
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -617,15 +617,11 @@
   runSQL_ "DROP TABLE test1_"
 
 getConnString :: IO (T.Text, [String])
-getConnString = do
-  args <- getArgs
-  if (null args) then
-    do isTravis <- maybe False ((==) "true") <$> lookupEnv "TRAVIS"
-       if isTravis
-         then return ("postgresql://postgres@localhost/travis_ci_test", [])
-         else do printUsage
-                 exitFailure
-    else return $ (T.pack . head $ args, tail args)
+getConnString = getArgs >>= \case
+  connString : args -> return (T.pack connString, args)
+  [] -> lookupEnv "GITHUB_ACTIONS" >>= \case
+    Just "true" -> return ("host=postgres user=postgres password=postgres", [])
+    _           -> printUsage >> exitFailure
   where
     printUsage = do
       prog <- getProgName
