diff --git a/hasql-dynamic-statements.cabal b/hasql-dynamic-statements.cabal
--- a/hasql-dynamic-statements.cabal
+++ b/hasql-dynamic-statements.cabal
@@ -1,117 +1,110 @@
-name:          hasql-dynamic-statements
-version:       0.3.1.5
-synopsis:      Toolkit for constructing Hasql statements dynamically
+cabal-version: 3.0
+name: hasql-dynamic-statements
+version: 0.3.1.6
+synopsis: Toolkit for constructing Hasql statements dynamically
 description:
   This library introduces into the Hasql ecosystem a new abstraction named Snippet,
   which makes it trivial to construct SQL, while injecting values.
   It is intended to be used when the SQL of your statement depends on the parameters,
   that you want to pass in.
 
-homepage:      https://github.com/nikita-volkov/hasql-dynamic-statements
+homepage: https://github.com/nikita-volkov/hasql-dynamic-statements
 bug-reports:
   https://github.com/nikita-volkov/hasql-dynamic-statements/issues
 
-author:        Nikita Volkov <nikita.y.volkov@mail.ru>
-maintainer:    Nikita Volkov <nikita.y.volkov@mail.ru>
-copyright:     (c) 2019, Nikita Volkov
-license:       MIT
-license-file:  LICENSE
-build-type:    Simple
-cabal-version: >=1.10
+author: Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>
+copyright: (c) 2019, Nikita Volkov
+license: MIT
+license-file: LICENSE
 
 source-repository head
-  type:     git
+  type: git
   location: git://github.com/nikita-volkov/hasql-dynamic-statements.git
 
-library
-  hs-source-dirs:     library
-  default-extensions:
-    NoImplicitPrelude
-    BangPatterns
-    DeriveDataTypeable
-    DeriveFunctor
-    DeriveGeneric
-    DeriveTraversable
-    FlexibleContexts
-    FlexibleInstances
-    GeneralizedNewtypeDeriving
-    LambdaCase
-    OverloadedStrings
-    RankNTypes
-    ScopedTypeVariables
-    StandaloneDeriving
-    TypeApplications
-    TypeFamilies
-
-  ghc-options:        -funbox-strict-fields
-  default-language:   Haskell2010
-  exposed-modules:
-    Hasql.DynamicStatements.Session
-    Hasql.DynamicStatements.Snippet
-    Hasql.DynamicStatements.Statement
-
-  other-modules:
-    Hasql.DynamicStatements.Prelude
-    Hasql.DynamicStatements.Snippet.Defs
-
-  build-depends:
-      base >=4.12 && <5
-    , bytestring >=0.10 && <0.13
-    , containers >=0.6 && <0.8
-    , hasql >=1.6 && <1.7
-    , hasql-implicits >=0.1.1.2 && <0.2
-    , ptr >=0.16.7.2 && <0.17
-
-test-suite test
-  type:               exitcode-stdio-1.0
-  hs-source-dirs:     test
-  main-is:            Main.hs
+common base
+  default-language: Haskell2010
   default-extensions:
-    NoImplicitPrelude
-    NoMonomorphismRestriction
-    Arrows
+    ApplicativeDo
     BangPatterns
-    ConstraintKinds
-    DataKinds
+    BlockArguments
     DefaultSignatures
     DeriveDataTypeable
     DeriveFoldable
     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
     TypeApplications
     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.DynamicStatements.Session
+    Hasql.DynamicStatements.Snippet
+    Hasql.DynamicStatements.Statement
+
+  other-modules:
+    Hasql.DynamicStatements.Prelude
+    Hasql.DynamicStatements.Snippet.Defs
+
   build-depends:
-      hasql
-    , hasql-dynamic-statements
-    , QuickCheck >=2.8.1 && <3
-    , quickcheck-instances >=0.3.11 && <0.4
-    , rerebase <2
-    , tasty >=0.12 && <2
-    , tasty-hunit >=0.9 && <0.11
-    , tasty-quickcheck >=0.9 && <0.11
+    base >=4.14 && <5,
+    bytestring >=0.10 && <0.13,
+    containers >=0.6 && <0.8,
+    hasql >=1.7 && <1.8,
+    hasql-implicits >=0.1.1.2 && <0.2,
+    ptr >=0.16.7.2 && <0.17,
+
+test-suite test
+  import: test
+  type: exitcode-stdio-1.0
+  hs-source-dirs: test
+  main-is: Main.hs
+  build-depends:
+    hasql,
+    hasql-dynamic-statements,
+    rerebase <2,
+    tasty >=0.12 && <2,
+    tasty-hunit >=0.9 && <0.11,
diff --git a/library/Hasql/DynamicStatements/Prelude.hs b/library/Hasql/DynamicStatements/Prelude.hs
--- a/library/Hasql/DynamicStatements/Prelude.hs
+++ b/library/Hasql/DynamicStatements/Prelude.hs
@@ -64,8 +64,6 @@
 import System.Mem as Exports
 import System.Mem.StableName as Exports
 import System.Timeout as Exports
-import Text.ParserCombinators.ReadP as Exports (ReadP, ReadS, readP_to_S, readS_to_P)
-import Text.ParserCombinators.ReadPrec as Exports (ReadPrec, readP_to_Prec, readPrec_to_P, readPrec_to_S, readS_to_Prec)
 import Text.Printf as Exports (hPrintf, printf)
 import Text.Read as Exports (Read (..), readEither, readMaybe)
 import Unsafe.Coerce as Exports
diff --git a/library/Hasql/DynamicStatements/Session.hs b/library/Hasql/DynamicStatements/Session.hs
--- a/library/Hasql/DynamicStatements/Session.hs
+++ b/library/Hasql/DynamicStatements/Session.hs
@@ -1,11 +1,11 @@
 module Hasql.DynamicStatements.Session where
 
-import qualified Hasql.Decoders as Decoders
+import Hasql.Decoders qualified as Decoders
 import Hasql.DynamicStatements.Prelude
-import qualified Hasql.DynamicStatements.Snippet.Defs as SnippetDefs
-import qualified Hasql.DynamicStatements.Statement as Statement
+import Hasql.DynamicStatements.Snippet.Defs qualified as SnippetDefs
+import Hasql.DynamicStatements.Statement qualified as Statement
 import Hasql.Session
-import qualified Hasql.Session as Session
+import Hasql.Session qualified as Session
 
 -- |
 -- Execute a dynamically parameterized statement, providing a result decoder.
diff --git a/library/Hasql/DynamicStatements/Snippet/Defs.hs b/library/Hasql/DynamicStatements/Snippet/Defs.hs
--- a/library/Hasql/DynamicStatements/Snippet/Defs.hs
+++ b/library/Hasql/DynamicStatements/Snippet/Defs.hs
@@ -1,8 +1,8 @@
 module Hasql.DynamicStatements.Snippet.Defs where
 
 import Hasql.DynamicStatements.Prelude
-import qualified Hasql.Encoders as Encoders
-import qualified Hasql.Implicits.Encoders as Encoders
+import Hasql.Encoders qualified as Encoders
+import Hasql.Implicits.Encoders qualified as Encoders
 
 -- |
 -- Composable SQL snippet with parameters injected.
diff --git a/library/Hasql/DynamicStatements/Statement.hs b/library/Hasql/DynamicStatements/Statement.hs
--- a/library/Hasql/DynamicStatements/Statement.hs
+++ b/library/Hasql/DynamicStatements/Statement.hs
@@ -1,12 +1,11 @@
 module Hasql.DynamicStatements.Statement where
 
-import qualified Hasql.Decoders as Decoders
+import Hasql.Decoders qualified as Decoders
 import Hasql.DynamicStatements.Prelude
-import qualified Hasql.DynamicStatements.Snippet.Defs as SnippetDefs
-import qualified Hasql.Encoders as Encoders
+import Hasql.DynamicStatements.Snippet.Defs qualified as SnippetDefs
 import Hasql.Statement
-import qualified Ptr.ByteString as ByteString
-import qualified Ptr.Poking as Poking
+import Ptr.ByteString qualified as ByteString
+import Ptr.Poking qualified as Poking
 
 -- |
 -- Construct a statement dynamically, specifying the parameters in-place
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,26 +1,23 @@
 module Main where
 
-import qualified Data.ByteString as ByteString
-import qualified Data.ByteString.Char8 as ByteStringChar8
-import qualified Hasql.Connection as Connection
-import qualified Hasql.Decoders as Decoders
-import qualified Hasql.DynamicStatements.Session as Session
-import qualified Hasql.DynamicStatements.Snippet as Snippet
-import qualified Hasql.DynamicStatements.Statement as Statement
-import qualified Hasql.Encoders as Encoders
-import qualified Hasql.Session as Session
-import qualified Hasql.Statement as Statement
-import qualified Test.QuickCheck as QuickCheck
-import Test.QuickCheck.Instances
+import Data.ByteString qualified as ByteString
+import Data.ByteString.Char8 qualified as ByteStringChar8
+import Hasql.Connection qualified as Connection
+import Hasql.Decoders qualified as Decoders
+import Hasql.DynamicStatements.Session qualified as Session
+import Hasql.DynamicStatements.Snippet qualified as Snippet
+import Hasql.DynamicStatements.Statement qualified as Statement
+import Hasql.Session qualified as Session
+import Hasql.Statement qualified as Statement
 import Test.Tasty
 import Test.Tasty.HUnit
-import Test.Tasty.QuickCheck
-import Test.Tasty.Runners
 import Prelude hiding (assert)
 
+main :: IO ()
 main =
   defaultMain tree
 
+tree :: TestTree
 tree =
   testGroup
     "All tests"
@@ -54,7 +51,7 @@
         ]
     ]
 
-runSession :: Session.Session a -> IO (Either Connection.ConnectionError (Either Session.QueryError a))
+runSession :: Session.Session a -> IO (Either Connection.ConnectionError (Either Session.SessionError a))
 runSession = withConnection . Session.run
 
 withConnection :: (Connection.Connection -> IO a) -> IO (Either Connection.ConnectionError a)
