diff --git a/conflicts-test/Main.hs b/conflicts-test/Main.hs
--- a/conflicts-test/Main.hs
+++ b/conflicts-test/Main.hs
@@ -1,12 +1,12 @@
 module Main where
 
-import qualified Control.Concurrent.Async as F
-import qualified Hasql.Connection as A
-import qualified Hasql.Session as B
-import qualified Hasql.Transaction as C
-import qualified Hasql.Transaction.Sessions as G
-import qualified Main.Statements as D
-import qualified Main.Transactions as E
+import Control.Concurrent.Async qualified as F
+import Hasql.Connection qualified as A
+import Hasql.Session qualified as B
+import Hasql.Transaction qualified as C
+import Hasql.Transaction.Sessions qualified as G
+import Main.Statements qualified as D
+import Main.Transactions qualified as E
 import Prelude
 
 main :: IO ()
diff --git a/conflicts-test/Main/Statements.hs b/conflicts-test/Main/Statements.hs
--- a/conflicts-test/Main/Statements.hs
+++ b/conflicts-test/Main/Statements.hs
@@ -1,8 +1,8 @@
 module Main.Statements where
 
 import Contravariant.Extras
-import qualified Hasql.Decoders as D
-import qualified Hasql.Encoders as E
+import Hasql.Decoders qualified as D
+import Hasql.Encoders qualified as E
 import Hasql.Statement
 import Prelude
 
diff --git a/conflicts-test/Main/Transactions.hs b/conflicts-test/Main/Transactions.hs
--- a/conflicts-test/Main/Transactions.hs
+++ b/conflicts-test/Main/Transactions.hs
@@ -1,7 +1,7 @@
 module Main.Transactions where
 
 import Hasql.Transaction
-import qualified Main.Statements as A
+import Main.Statements qualified as A
 import Prelude
 
 createSchema :: Transaction ()
diff --git a/hasql-transaction.cabal b/hasql-transaction.cabal
--- a/hasql-transaction.cabal
+++ b/hasql-transaction.cabal
@@ -1,31 +1,30 @@
-name:               hasql-transaction
-version:            1.1.0.1
-category:           Hasql, Database, PostgreSQL
+cabal-version: 3.0
+name: hasql-transaction
+version: 1.1.1
+category: Hasql, Database, PostgreSQL
 synopsis:
   Composable abstraction over retryable transactions for Hasql
 
-homepage:           https://github.com/nikita-volkov/hasql-transaction
-bug-reports:        https://github.com/nikita-volkov/hasql-transaction/issues
-author:             Nikita Volkov <nikita.y.volkov@mail.ru>
-maintainer:         Nikita Volkov <nikita.y.volkov@mail.ru>
-copyright:          (c) 2015, Nikita Volkov
-license:            MIT
-license-file:       LICENSE
-build-type:         Simple
-cabal-version:      >=1.10
+homepage: https://github.com/nikita-volkov/hasql-transaction
+bug-reports: https://github.com/nikita-volkov/hasql-transaction/issues
+author: Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>
+copyright: (c) 2015, Nikita Volkov
+license: MIT
+license-file: LICENSE
 extra-source-files: CHANGELOG.md
+tested-with: ghc ==9.8.2 || ==8.10.1
 
 source-repository head
-  type:     git
+  type: git
   location: git://github.com/nikita-volkov/hasql-transaction.git
 
-library
-  hs-source-dirs:     library
+common base
+  default-language: Haskell2010
   default-extensions:
-    NoImplicitPrelude
-    NoMonomorphismRestriction
-    Arrows
+    ApplicativeDo
     BangPatterns
+    BlockArguments
     ConstraintKinds
     DataKinds
     DefaultSignatures
@@ -34,32 +33,51 @@
     DeriveFunctor
     DeriveGeneric
     DeriveTraversable
+    DerivingVia
     EmptyDataDecls
     FlexibleContexts
     FlexibleInstances
     FunctionalDependencies
     GADTs
     GeneralizedNewtypeDeriving
+    ImportQualifiedPost
     LambdaCase
     LiberalTypeSynonyms
-    MagicHash
     MultiParamTypeClasses
     MultiWayIf
+    NoImplicitPrelude
+    NoMonomorphismRestriction
     OverloadedStrings
-    ParallelListComp
     PatternGuards
     QuasiQuotes
     RankNTypes
     RecordWildCards
+    RoleAnnotations
     ScopedTypeVariables
     StandaloneDeriving
-    TemplateHaskell
+    StrictData
     TupleSections
     TypeFamilies
     TypeOperators
-    UnboxedTuples
 
-  default-language:   Haskell2010
+common executable
+  import: base
+  ghc-options:
+    -O2
+    -threaded
+    -with-rtsopts=-N
+    -rtsopts
+    -funbox-strict-fields
+
+common test
+  import: base
+  ghc-options:
+    -threaded
+    -with-rtsopts=-N
+
+library
+  import: base
+  hs-source-dirs: library
   exposed-modules:
     Hasql.Transaction
     Hasql.Transaction.Sessions
@@ -67,72 +85,38 @@
   other-modules:
     Hasql.Transaction.Config
     Hasql.Transaction.Private.Prelude
-    Hasql.Transaction.Private.Sessions
     Hasql.Transaction.Private.SQL
+    Hasql.Transaction.Private.Sessions
     Hasql.Transaction.Private.Statements
     Hasql.Transaction.Private.Transaction
 
   build-depends:
-      base >=4.12 && <5
-    , bytestring >=0.10 && <0.13
-    , bytestring-tree-builder >=0.2.7.8 && <0.3
-    , contravariant >=1.3 && <2
-    , contravariant-extras >=0.3 && <0.4
-    , hasql >=1.6 && <1.7
-    , mtl >=2.2 && <3
-    , transformers >=0.5 && <0.7
+    base >=4.12 && <5,
+    bytestring >=0.10 && <0.13,
+    bytestring-tree-builder >=0.2.7.8 && <0.3,
+    contravariant >=1.3 && <2,
+    contravariant-extras >=0.3 && <0.4,
+    hasql >=1.7 && <1.8,
+    mtl >=2.2 && <3,
+    transformers >=0.5 && <0.7,
 
 test-suite conflicts-test
-  type:               exitcode-stdio-1.0
-  hs-source-dirs:     conflicts-test
-  default-extensions:
-    NoImplicitPrelude
-    NoMonomorphismRestriction
-    Arrows
-    BangPatterns
-    ConstraintKinds
-    DataKinds
-    DefaultSignatures
-    DeriveDataTypeable
-    DeriveFoldable
-    DeriveFunctor
-    DeriveGeneric
-    DeriveTraversable
-    EmptyDataDecls
-    FlexibleContexts
-    FlexibleInstances
-    FunctionalDependencies
-    GADTs
-    GeneralizedNewtypeDeriving
-    LambdaCase
-    LiberalTypeSynonyms
-    MagicHash
-    MultiParamTypeClasses
-    MultiWayIf
-    OverloadedStrings
-    ParallelListComp
-    PatternGuards
-    QuasiQuotes
-    RankNTypes
-    RecordWildCards
-    ScopedTypeVariables
-    StandaloneDeriving
-    TemplateHaskell
-    TupleSections
-    TypeFamilies
-    TypeOperators
-    UnboxedTuples
-
-  default-language:   Haskell2010
-  main-is:            Main.hs
+  import: test
+  type: exitcode-stdio-1.0
+  hs-source-dirs: conflicts-test
+  main-is: Main.hs
   other-modules:
     Main.Statements
     Main.Transactions
 
-  ghc-options:        -O2 -threaded -with-rtsopts=-N
+  ghc-options:
+    -O2
+    -threaded
+    -with-rtsopts=-N
+
   build-depends:
-      async >=2.1 && <3
-    , contravariant-extras >=0.3 && <0.4
-    , hasql
-    , hasql-transaction
-    , rerebase >=1.11 && <2
+    async >=2.1 && <3,
+    contravariant-extras >=0.3 && <0.4,
+    hasql,
+    hasql-transaction,
+    rerebase >=1.11 && <2,
diff --git a/library/Hasql/Transaction/Private/SQL.hs b/library/Hasql/Transaction/Private/SQL.hs
--- a/library/Hasql/Transaction/Private/SQL.hs
+++ b/library/Hasql/Transaction/Private/SQL.hs
@@ -1,6 +1,6 @@
 module Hasql.Transaction.Private.SQL where
 
-import qualified ByteString.TreeBuilder as D
+import ByteString.TreeBuilder qualified as D
 import Hasql.Transaction.Config
 import Hasql.Transaction.Private.Prelude
 
diff --git a/library/Hasql/Transaction/Private/Sessions.hs b/library/Hasql/Transaction/Private/Sessions.hs
--- a/library/Hasql/Transaction/Private/Sessions.hs
+++ b/library/Hasql/Transaction/Private/Sessions.hs
@@ -3,7 +3,7 @@
 import Hasql.Session
 import Hasql.Transaction.Config
 import Hasql.Transaction.Private.Prelude
-import qualified Hasql.Transaction.Private.Statements as Statements
+import Hasql.Transaction.Private.Statements qualified as Statements
 
 {-
 We may want to
@@ -37,10 +37,15 @@
     then statement () (Statements.commitTransaction preparable)
     else statement () (Statements.abortTransaction preparable)
 
-handleTransactionError :: QueryError -> Session a -> Session a
+handleTransactionError :: SessionError -> Session a -> Session a
 handleTransactionError error onTransactionError = case error of
-  QueryError _ _ (ResultError (ServerError code _ _ _ _)) -> case code of
-    "40001" -> onTransactionError
-    "40P01" -> onTransactionError
-    _ -> throwError error
-  error -> throwError error
+  QueryError _ _ clientError -> onCommandError clientError
+  PipelineError clientError -> onCommandError clientError
+  where
+    onCommandError = \case
+      ResultError (ServerError code _ _ _ _) ->
+        case code of
+          "40001" -> onTransactionError
+          "40P01" -> onTransactionError
+          _ -> throwError error
+      _ -> throwError error
diff --git a/library/Hasql/Transaction/Private/Statements.hs b/library/Hasql/Transaction/Private/Statements.hs
--- a/library/Hasql/Transaction/Private/Statements.hs
+++ b/library/Hasql/Transaction/Private/Statements.hs
@@ -1,11 +1,11 @@
 module Hasql.Transaction.Private.Statements where
 
-import qualified Hasql.Decoders as C
-import qualified Hasql.Encoders as B
-import qualified Hasql.Statement as A
+import Hasql.Decoders qualified as C
+import Hasql.Encoders qualified as B
+import Hasql.Statement qualified as A
 import Hasql.Transaction.Config
 import Hasql.Transaction.Private.Prelude
-import qualified Hasql.Transaction.Private.SQL as D
+import Hasql.Transaction.Private.SQL qualified as D
 
 -- * Transactions
 
diff --git a/library/Hasql/Transaction/Private/Transaction.hs b/library/Hasql/Transaction/Private/Transaction.hs
--- a/library/Hasql/Transaction/Private/Transaction.hs
+++ b/library/Hasql/Transaction/Private/Transaction.hs
@@ -1,10 +1,10 @@
 module Hasql.Transaction.Private.Transaction where
 
-import qualified Hasql.Session as B
-import qualified Hasql.Statement as A
+import Hasql.Session qualified as B
+import Hasql.Statement qualified as A
 import Hasql.Transaction.Config
 import Hasql.Transaction.Private.Prelude
-import qualified Hasql.Transaction.Private.Sessions as D
+import Hasql.Transaction.Private.Sessions qualified as D
 
 -- |
 -- A composable abstraction over the retryable transactions.
diff --git a/library/Hasql/Transaction/Sessions.hs b/library/Hasql/Transaction/Sessions.hs
--- a/library/Hasql/Transaction/Sessions.hs
+++ b/library/Hasql/Transaction/Sessions.hs
@@ -9,9 +9,9 @@
 where
 
 import Data.Bool
-import qualified Hasql.Session as B
-import qualified Hasql.Transaction.Config as C
-import qualified Hasql.Transaction.Private.Transaction as A
+import Hasql.Session qualified as B
+import Hasql.Transaction.Config qualified as C
+import Hasql.Transaction.Private.Transaction qualified as A
 
 -- |
 -- Execute the transaction using the provided isolation level and mode.
