diff --git a/benchmarks/Main.hs b/benchmarks/Main.hs
--- a/benchmarks/Main.hs
+++ b/benchmarks/Main.hs
@@ -6,7 +6,7 @@
 import Criterion.Main
 import qualified Hasql.Connection as A
 import qualified Hasql.Session as B
-import qualified Hasql.Query as C
+import qualified Hasql.Statement as C
 import qualified Hasql.Decoders as D
 import qualified Hasql.Encoders as E
 import qualified Data.Vector as F
@@ -45,31 +45,31 @@
 
 sessionWithSingleLargeResultInVector :: B.Session (Vector (Int64, Int64))
 sessionWithSingleLargeResultInVector =
-  B.query () queryWithManyRowsInVector
+  B.statement () statementWithManyRowsInVector
 
 sessionWithManyLargeResults :: B.Session [Vector (Int64, Int64)]
 sessionWithManyLargeResults =
-  replicateM 1000 (B.query () queryWithManyRowsInVector)
+  replicateM 1000 (B.statement () statementWithManyRowsInVector)
 
 sessionWithSingleLargeResultInList :: B.Session (List (Int64, Int64))
 sessionWithSingleLargeResultInList =
-  B.query () queryWithManyRowsInList
+  B.statement () statementWithManyRowsInList
 
 sessionWithManySmallResults :: B.Session [(Int64, Int64)]
 sessionWithManySmallResults =
-  replicateM 1000 (B.query () queryWithSingleRow)
+  replicateM 1000 (B.statement () statementWithSingleRow)
 
 
 -- * Statements
 -------------------------
 
-queryWithManyParameters :: C.Query (Vector (Int64, Int64)) ()
-queryWithManyParameters =
+statementWithManyParameters :: C.Statement (Vector (Int64, Int64)) ()
+statementWithManyParameters =
   $(todo "statementWithManyParameters")
 
-queryWithSingleRow :: C.Query () (Int64, Int64)
-queryWithSingleRow =
-  C.Query template encoder decoder True
+statementWithSingleRow :: C.Statement () (Int64, Int64)
+statementWithSingleRow =
+  C.Statement template encoder decoder True
   where
     template =
       "SELECT 1, 2"
@@ -84,9 +84,9 @@
             tuple !a !b =
               (a, b)
 
-queryWithManyRows :: (D.Row (Int64, Int64) -> D.Result result) -> C.Query () result
-queryWithManyRows decoder =
-  C.Query template encoder (decoder rowDecoder) True
+statementWithManyRows :: (D.Row (Int64, Int64) -> D.Result result) -> C.Statement () result
+statementWithManyRows decoder =
+  C.Statement template encoder (decoder rowDecoder) True
   where
     template =
       "SELECT generate_series(0,1000) as a, generate_series(1000,2000) as b"
@@ -98,10 +98,10 @@
         tuple !a !b =
           (a, b)
 
-queryWithManyRowsInVector :: C.Query () (Vector (Int64, Int64))
-queryWithManyRowsInVector =
-  queryWithManyRows D.rowVector
+statementWithManyRowsInVector :: C.Statement () (Vector (Int64, Int64))
+statementWithManyRowsInVector =
+  statementWithManyRows D.rowVector
 
-queryWithManyRowsInList :: C.Query () (List (Int64, Int64))
-queryWithManyRowsInList =
-  queryWithManyRows D.rowList
+statementWithManyRowsInList :: C.Statement () (List (Int64, Int64))
+statementWithManyRowsInList =
+  statementWithManyRows D.rowList
diff --git a/hasql.cabal b/hasql.cabal
--- a/hasql.cabal
+++ b/hasql.cabal
@@ -1,7 +1,7 @@
 name:
   hasql
 version:
-  1.2
+  1.3
 category:
   Hasql, Database, PostgreSQL
 synopsis:
@@ -51,7 +51,7 @@
     Hasql.Decoders
     Hasql.Encoders
     Hasql.Connection
-    Hasql.Query
+    Hasql.Statement
     Hasql.Session
   other-modules:
     Hasql.Private.Prelude
@@ -114,7 +114,7 @@
   other-modules:
     Main.DSL
     Main.Connection
-    Main.Queries
+    Main.Statements
     Main.Prelude
   default-extensions:
     Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
@@ -143,7 +143,7 @@
   main-is:
     Main.hs
   other-modules:
-    Main.Queries
+    Main.Statements
   ghc-options:
     -O2
     -threaded
diff --git a/library/Hasql/Decoders.hs b/library/Hasql/Decoders.hs
--- a/library/Hasql/Decoders.hs
+++ b/library/Hasql/Decoders.hs
@@ -102,7 +102,7 @@
 
 -- |
 -- Exactly one row.
--- Will raise the 'Hasql.Query.UnexpectedAmountOfRows' error if it's any other.
+-- Will raise the 'Hasql.Errors.UnexpectedAmountOfRows' error if it's any other.
 -- 
 {-# INLINABLE singleRow #-}
 singleRow :: Row a -> Result a
diff --git a/library/Hasql/Encoders.hs b/library/Hasql/Encoders.hs
--- a/library/Hasql/Encoders.hs
+++ b/library/Hasql/Encoders.hs
@@ -536,13 +536,13 @@
 
 -- $insertMany
 -- It is not currently possible to pass in an array of encodable values
--- to use in an 'insert many' query using Hasql. Instead, PostgreSQL's
+-- to use in an 'insert many' statement using Hasql. Instead, PostgreSQL's
 --  (9.4 or later) `unnest` function can be used to in an analogous way
 -- to haskell's `zip` function by passing in multiple arrays of values
 -- to be zipped into the rows we want to insert:
 --
 -- @
---   insertMultipleLocations :: Query (Vector (UUID, Double, Double)) ()
+--   insertMultipleLocations :: Statement (Vector (UUID, Double, Double)) ()
 --   insertMultipleLocations =
 --     statement sql encoder decoder True
 --     where
diff --git a/library/Hasql/Private/IO.hs b/library/Hasql/Private/IO.hs
--- a/library/Hasql/Private/IO.hs
+++ b/library/Hasql/Private/IO.hs
@@ -106,8 +106,8 @@
     False -> fmap (Left . ClientError) $ LibPQ.errorMessage connection
     True -> pure (Right ())
 
-{-# INLINE sendPreparedParametricQuery #-}
-sendPreparedParametricQuery ::
+{-# INLINE sendPreparedParametricStatement #-}
+sendPreparedParametricStatement ::
   LibPQ.Connection ->
   PreparedStatementRegistry.PreparedStatementRegistry ->
   Bool ->
@@ -115,7 +115,7 @@
   ParamsEncoders.Params a ->
   a ->
   IO (Either CommandError ())
-sendPreparedParametricQuery connection registry integerDatetimes template (ParamsEncoders.Params (Op encoderOp)) input =
+sendPreparedParametricStatement connection registry integerDatetimes template (ParamsEncoders.Params (Op encoderOp)) input =
   let
     (oidList, valueAndFormatList) =
       let
@@ -128,15 +128,15 @@
       key <- ExceptT $ getPreparedStatementKey connection registry template oidList
       ExceptT $ checkedSend connection $ LibPQ.sendQueryPrepared connection key valueAndFormatList LibPQ.Binary
 
-{-# INLINE sendUnpreparedParametricQuery #-}
-sendUnpreparedParametricQuery ::
+{-# INLINE sendUnpreparedParametricStatement #-}
+sendUnpreparedParametricStatement ::
   LibPQ.Connection ->
   Bool ->
   ByteString ->
   ParamsEncoders.Params a ->
   a ->
   IO (Either CommandError ())
-sendUnpreparedParametricQuery connection integerDatetimes template (ParamsEncoders.Params (Op encoderOp)) input =
+sendUnpreparedParametricStatement connection integerDatetimes template (ParamsEncoders.Params (Op encoderOp)) input =
   let
     params =
       let
@@ -145,8 +145,8 @@
         in foldr step [] (encoderOp input)
     in checkedSend connection $ LibPQ.sendQueryParams connection template params LibPQ.Binary
 
-{-# INLINE sendParametricQuery #-}
-sendParametricQuery ::
+{-# INLINE sendParametricStatement #-}
+sendParametricStatement ::
   LibPQ.Connection ->
   Bool -> 
   PreparedStatementRegistry.PreparedStatementRegistry ->
@@ -155,13 +155,13 @@
   Bool ->
   a ->
   IO (Either CommandError ())
-sendParametricQuery connection integerDatetimes registry template encoder prepared params =
-  {-# SCC "sendParametricQuery" #-} 
+sendParametricStatement connection integerDatetimes registry template encoder prepared params =
+  {-# SCC "sendParametricStatement" #-} 
   if prepared
-    then sendPreparedParametricQuery connection registry integerDatetimes template encoder params
-    else sendUnpreparedParametricQuery connection integerDatetimes template encoder params
+    then sendPreparedParametricStatement connection registry integerDatetimes template encoder params
+    else sendUnpreparedParametricStatement connection integerDatetimes template encoder params
 
-{-# INLINE sendNonparametricQuery #-}
-sendNonparametricQuery :: LibPQ.Connection -> ByteString -> IO (Either CommandError ())
-sendNonparametricQuery connection sql =
+{-# INLINE sendNonparametricStatement #-}
+sendNonparametricStatement :: LibPQ.Connection -> ByteString -> IO (Either CommandError ())
+sendNonparametricStatement connection sql =
   checkedSend connection $ LibPQ.sendQuery connection sql
diff --git a/library/Hasql/Private/Session.hs b/library/Hasql/Private/Session.hs
--- a/library/Hasql/Private/Session.hs
+++ b/library/Hasql/Private/Session.hs
@@ -9,7 +9,7 @@
 import qualified Hasql.Private.Encoders.Params as Encoders.Params
 import qualified Hasql.Private.Settings as Settings
 import qualified Hasql.Private.IO as IO
-import qualified Hasql.Query as Query
+import qualified Hasql.Statement as Statement
 import qualified Hasql.Private.Connection as Connection
 
 
@@ -34,7 +34,7 @@
 sql sql =
   Session $ ReaderT $ \(Connection.Connection pqConnectionRef integerDatetimes registry) ->
     ExceptT $ fmap (mapLeft (QueryError sql [])) $ withMVar pqConnectionRef $ \pqConnection -> do
-      r1 <- IO.sendNonparametricQuery pqConnection sql
+      r1 <- IO.sendNonparametricStatement pqConnection sql
       r2 <- IO.getResults pqConnection integerDatetimes decoder
       return $ r1 *> r2
   where
@@ -42,12 +42,12 @@
       Decoders.Results.single Decoders.Result.unit
 
 -- |
--- Parameters and a specification of the parametric query to apply them to.
-query :: params -> Query.Query params result -> Session result
-query input (Query.Query template encoder decoder preparable) =
+-- Parameters and a specification of a parametric single-statement query to apply them to.
+statement :: params -> Statement.Statement params result -> Session result
+statement input (Statement.Statement template encoder decoder preparable) =
   Session $ ReaderT $ \(Connection.Connection pqConnectionRef integerDatetimes registry) ->
     ExceptT $ fmap (mapLeft (QueryError template inputReps)) $ withMVar pqConnectionRef $ \pqConnection -> do
-      r1 <- IO.sendParametricQuery pqConnection integerDatetimes registry template (unsafeCoerce encoder) preparable input
+      r1 <- IO.sendParametricStatement pqConnection integerDatetimes registry template (unsafeCoerce encoder) preparable input
       r2 <- IO.getResults pqConnection integerDatetimes (unsafeCoerce decoder)
       return $ r1 *> r2
   where
diff --git a/library/Hasql/Query.hs b/library/Hasql/Query.hs
deleted file mode 100644
--- a/library/Hasql/Query.hs
+++ /dev/null
@@ -1,55 +0,0 @@
-module Hasql.Query
-where
-
-import Hasql.Private.Prelude
-import qualified Hasql.Decoders as Decoders
-import qualified Hasql.Encoders as Encoders
-
-
--- |
--- A specification of a strictly single-statement query, which can be parameterized and prepared.
--- 
--- Consists of the following:
--- 
--- * SQL template,
--- * params encoder,
--- * result decoder,
--- * a flag, determining whether it should be prepared.
--- 
--- The SQL template must be formatted according to Postgres' standard,
--- with any non-ASCII characters of the template encoded using UTF-8.
--- According to the format,
--- parameters must be referred to using the positional notation, as in the following:
--- @$1@, @$2@, @$3@ and etc.
--- Those references must be used to refer to the values of the 'Encoders.Params' encoder.
--- 
--- Following is an example of the declaration of a prepared statement with its associated codecs.
--- 
--- @
--- selectSum :: Hasql.Query.'Query' (Int64, Int64) Int64
--- selectSum =
---   Hasql.Query.'Query' sql encoder decoder True
---   where
---     sql =
---       "select ($1 + $2)"
---     encoder =
---       'contramap' 'fst' (Hasql.Encoders.'Hasql.Encoders.value' Hasql.Encoders.'Hasql.Encoders.int8') '<>'
---       'contramap' 'snd' (Hasql.Encoders.'Hasql.Encoders.value' Hasql.Encoders.'Hasql.Encoders.int8')
---     decoder =
---       Hasql.Decoders.'Hasql.Decoders.singleRow' (Hasql.Decoders.'Hasql.Decoders.value' Hasql.Decoders.'Hasql.Decoders.int8')
--- @
--- 
--- The statement above accepts a product of two parameters of type 'Int64'
--- and produces a single result of type 'Int64'.
--- 
-data Query a b =
-  Query ByteString (Encoders.Params a) (Decoders.Result b) Bool
-
-instance Functor (Query a) where
-  {-# INLINE fmap #-}
-  fmap = rmap
-
-instance Profunctor Query where
-  {-# INLINE dimap #-}
-  dimap f1 f2 (Query template encoder decoder preparable) =
-    Query template (contramap f1 encoder) (fmap f2 decoder) preparable
diff --git a/library/Hasql/Session.hs b/library/Hasql/Session.hs
--- a/library/Hasql/Session.hs
+++ b/library/Hasql/Session.hs
@@ -2,7 +2,7 @@
 (
   Session,
   sql,
-  query,
+  statement,
   -- * Execution
   run,
   -- * Errors
diff --git a/library/Hasql/Statement.hs b/library/Hasql/Statement.hs
new file mode 100644
--- /dev/null
+++ b/library/Hasql/Statement.hs
@@ -0,0 +1,55 @@
+module Hasql.Statement
+where
+
+import Hasql.Private.Prelude
+import qualified Hasql.Decoders as Decoders
+import qualified Hasql.Encoders as Encoders
+
+
+-- |
+-- A specification of a strictly single-statement query, which can be parameterized and prepared.
+-- 
+-- Consists of the following:
+-- 
+-- * SQL template,
+-- * params encoder,
+-- * result decoder,
+-- * a flag, determining whether it should be prepared.
+-- 
+-- The SQL template must be formatted according to Postgres' standard,
+-- with any non-ASCII characters of the template encoded using UTF-8.
+-- According to the format,
+-- parameters must be referred to using the positional notation, as in the following:
+-- @$1@, @$2@, @$3@ and etc.
+-- Those references must be used to refer to the values of the 'Encoders.Params' encoder.
+-- 
+-- Following is an example of the declaration of a prepared statement with its associated codecs.
+-- 
+-- @
+-- selectSum :: Hasql.Statement.'Statement' (Int64, Int64) Int64
+-- selectSum =
+--   Hasql.Statement.'Statement' sql encoder decoder True
+--   where
+--     sql =
+--       "select ($1 + $2)"
+--     encoder =
+--       'contramap' 'fst' (Hasql.Encoders.'Hasql.Encoders.value' Hasql.Encoders.'Hasql.Encoders.int8') '<>'
+--       'contramap' 'snd' (Hasql.Encoders.'Hasql.Encoders.value' Hasql.Encoders.'Hasql.Encoders.int8')
+--     decoder =
+--       Hasql.Decoders.'Hasql.Decoders.singleRow' (Hasql.Decoders.'Hasql.Decoders.value' Hasql.Decoders.'Hasql.Decoders.int8')
+-- @
+-- 
+-- The statement above accepts a product of two parameters of type 'Int64'
+-- and produces a single result of type 'Int64'.
+-- 
+data Statement a b =
+  Statement ByteString (Encoders.Params a) (Decoders.Result b) Bool
+
+instance Functor (Statement a) where
+  {-# INLINE fmap #-}
+  fmap = rmap
+
+instance Profunctor Statement where
+  {-# INLINE dimap #-}
+  dimap f1 f2 (Statement template encoder decoder preparable) =
+    Statement template (contramap f1 encoder) (fmap f2 decoder) preparable
diff --git a/profiling/Main.hs b/profiling/Main.hs
--- a/profiling/Main.hs
+++ b/profiling/Main.hs
@@ -4,7 +4,7 @@
 import Bug
 import qualified Hasql.Connection as A
 import qualified Hasql.Session as B
-import qualified Hasql.Query as C
+import qualified Hasql.Statement as C
 import qualified Hasql.Decoders as D
 import qualified Hasql.Encoders as E
 import qualified Data.Vector as F
@@ -40,27 +40,27 @@
 
 sessionWithSingleLargeResultInVector :: B.Session (Vector (Int64, Int64))
 sessionWithSingleLargeResultInVector =
-  B.query () queryWithManyRowsInVector
+  B.statement () statementWithManyRowsInVector
 
 sessionWithSingleLargeResultInList :: B.Session (List (Int64, Int64))
 sessionWithSingleLargeResultInList =
-  B.query () queryWithManyRowsInList
+  B.statement () statementWithManyRowsInList
 
 sessionWithManySmallResults :: B.Session (Vector (Int64, Int64))
 sessionWithManySmallResults =
-  F.replicateM 1000 (B.query () queryWithSingleRow)
+  F.replicateM 1000 (B.statement () statementWithSingleRow)
 
 
 -- * Statements
 -------------------------
 
-queryWithManyParameters :: C.Query (Vector (Int64, Int64)) ()
-queryWithManyParameters =
+statementWithManyParameters :: C.Statement (Vector (Int64, Int64)) ()
+statementWithManyParameters =
   $(todo "statementWithManyParameters")
 
-queryWithSingleRow :: C.Query () (Int64, Int64)
-queryWithSingleRow =
-  C.Query template encoder decoder True
+statementWithSingleRow :: C.Statement () (Int64, Int64)
+statementWithSingleRow =
+  C.Statement template encoder decoder True
   where
     template =
       "SELECT 1, 2"
@@ -75,9 +75,9 @@
             tuple !a !b =
               (a, b)
 
-queryWithManyRows :: (D.Row (Int64, Int64) -> D.Result result) -> C.Query () result
-queryWithManyRows decoder =
-  C.Query template encoder (decoder rowDecoder) True
+statementWithManyRows :: (D.Row (Int64, Int64) -> D.Result result) -> C.Statement () result
+statementWithManyRows decoder =
+  C.Statement template encoder (decoder rowDecoder) True
   where
     template =
       "SELECT generate_series(0,1000) as a, generate_series(1000,2000) as b"
@@ -89,10 +89,10 @@
         tuple !a !b =
           (a, b)
 
-queryWithManyRowsInVector :: C.Query () (Vector (Int64, Int64))
-queryWithManyRowsInVector =
-  queryWithManyRows D.rowVector
+statementWithManyRowsInVector :: C.Statement () (Vector (Int64, Int64))
+statementWithManyRowsInVector =
+  statementWithManyRows D.rowVector
 
-queryWithManyRowsInList :: C.Query () (List (Int64, Int64))
-queryWithManyRowsInList =
-  queryWithManyRows D.rowList
+statementWithManyRowsInList :: C.Statement () (List (Int64, Int64))
+statementWithManyRowsInList =
+  statementWithManyRows D.rowList
diff --git a/tasty/Main.hs b/tasty/Main.hs
--- a/tasty/Main.hs
+++ b/tasty/Main.hs
@@ -7,10 +7,10 @@
 import Test.Tasty.HUnit
 import Test.Tasty.QuickCheck
 import qualified Test.QuickCheck as QuickCheck
-import qualified Main.Queries as Queries
+import qualified Main.Statements as Statements
 import qualified Main.DSL as DSL
 import qualified Main.Connection as Connection
-import qualified Hasql.Query as Query
+import qualified Hasql.Statement as Statement
 import qualified Hasql.Encoders as Encoders
 import qualified Hasql.Decoders as Decoders
 import qualified Hasql.Session as Session
@@ -24,8 +24,8 @@
   [
     testCase "Failed query" $
     let
-      query =
-        Query.Query "select true where 1 = any ($1) and $2" encoder decoder True
+      statement =
+        Statement.Statement "select true where 1 = any ($1) and $2" encoder decoder True
         where
           encoder =
             contrazip2
@@ -34,7 +34,7 @@
           decoder =
             fmap (maybe False (const True)) (Decoders.rowMaybe (Decoders.column Decoders.bool))
       session =
-        Session.query ([3, 7], "a") query
+        Session.statement ([3, 7], "a") statement
       in do
         x <- Connection.with (Session.run session)
         assertBool (show x) $ case x of
@@ -43,8 +43,8 @@
     ,
     testCase "IN simulation" $
     let
-      query =
-        Query.Query "select true where 1 = any ($1)" encoder decoder True
+      statement =
+        Statement.Statement "select true where 1 = any ($1)" encoder decoder True
         where
           encoder =
             Encoders.param (Encoders.array (Encoders.dimension foldl' (Encoders.element Encoders.int8)))
@@ -52,8 +52,8 @@
             fmap (maybe False (const True)) (Decoders.rowMaybe (Decoders.column Decoders.bool))
       session =
         do
-          result1 <- Session.query [1, 2] query
-          result2 <- Session.query [2, 3] query
+          result1 <- Session.statement [1, 2] statement
+          result2 <- Session.statement [2, 3] statement
           return (result1, result2)
       in do
         x <- Connection.with (Session.run session)
@@ -61,8 +61,8 @@
     ,
     testCase "NOT IN simulation" $
     let
-      query =
-        Query.Query "select true where 3 <> all ($1)" encoder decoder True
+      statement =
+        Statement.Statement "select true where 3 <> all ($1)" encoder decoder True
         where
           encoder =
             Encoders.param (Encoders.array (Encoders.dimension foldl' (Encoders.element Encoders.int8)))
@@ -70,8 +70,8 @@
             fmap (maybe False (const True)) (Decoders.rowMaybe (Decoders.column Decoders.bool))
       session =
         do
-          result1 <- Session.query [1, 2] query
-          result2 <- Session.query [2, 3] query
+          result1 <- Session.statement [1, 2] statement
+          result2 <- Session.statement [2, 3] statement
           return (result1, result2)
       in do
         x <- Connection.with (Session.run session)
@@ -79,8 +79,8 @@
     ,
     testCase "Composite decoding" $
     let
-      query =
-        Query.Query sql encoder decoder True
+      statement =
+        Statement.Statement sql encoder decoder True
         where
           sql =
             "select (1, true)"
@@ -89,15 +89,15 @@
           decoder =
             Decoders.singleRow (Decoders.column (Decoders.composite ((,) <$> Decoders.field Decoders.int8 <*> Decoders.field Decoders.bool)))
       session =
-        Session.query () query
+        Session.statement () statement
       in do
         x <- Connection.with (Session.run session)
         assertEqual (show x) (Right (Right (1, True))) x
     ,
     testCase "Complex composite decoding" $
     let
-      query =
-        Query.Query sql encoder decoder True
+      statement =
+        Statement.Statement sql encoder decoder True
         where
           sql =
             "select (1, true) as entity1, ('hello', 3) as entity2"
@@ -114,7 +114,7 @@
                 Decoders.composite $
                 (,) <$> Decoders.field Decoders.text <*> Decoders.field Decoders.int8
       session =
-        Session.query () query
+        Session.statement () statement
       in do
         x <- Connection.with (Session.run session)
         assertEqual (show x) (Right (Right ((1, True), ("hello", 3)))) x
@@ -127,10 +127,10 @@
           assertEqual (show x) (Right (Right [])) x
         where
           session =
-            Session.query () query
+            Session.statement () statement
             where
-              query =
-                Query.Query sql encoder decoder True
+              statement =
+                Statement.Statement sql encoder decoder True
                 where
                   sql =
                     "select array[]::int8[]"
@@ -154,10 +154,10 @@
             catchError session (const (pure ())) *> session
             where
               session =
-                Session.query () query
+                Session.statement () statement
                 where
-                  query =
-                    Query.Query sql encoder decoder True
+                  statement =
+                    Statement.Statement sql encoder decoder True
                     where
                       sql =
                         "absurd"
@@ -177,10 +177,10 @@
             try *> fail *> try
             where
               try =
-                Session.query 1 query
+                Session.statement 1 statement
                 where
-                  query =
-                    Query.Query sql encoder decoder True
+                  statement =
+                    Statement.Statement sql encoder decoder True
                     where
                       sql =
                         "select $1 :: int8"
@@ -194,9 +194,9 @@
     ,
     testCase "\"in progress after error\" bugfix" $
     let
-      sumQuery :: Query.Query (Int64, Int64) Int64
-      sumQuery =
-        Query.Query sql encoder decoder True
+      sumStatement :: Statement.Statement (Int64, Int64) Int64
+      sumStatement =
+        Statement.Statement sql encoder decoder True
         where
           sql =
             "select ($1 + $2)"
@@ -207,7 +207,7 @@
             Decoders.singleRow (Decoders.column Decoders.int8)
       sumSession :: Session.Session Int64
       sumSession =
-        Session.sql "begin" *> Session.query (1, 1) sumQuery <* Session.sql "end"
+        Session.sql "begin" *> Session.statement (1, 1) sumStatement <* Session.sql "end"
       errorSession :: Session.Session ()
       errorSession =
         Session.sql "asldfjsldk"
@@ -219,9 +219,9 @@
     ,
     testCase "\"another command is already in progress\" bugfix" $
     let
-      sumQuery :: Query.Query (Int64, Int64) Int64
-      sumQuery =
-        Query.Query sql encoder decoder True
+      sumStatement :: Statement.Statement (Int64, Int64) Int64
+      sumStatement =
+        Statement.Statement sql encoder decoder True
         where
           sql =
             "select ($1 + $2)"
@@ -234,7 +234,7 @@
       session =
         do
           Session.sql "begin;"
-          s <- Session.query (1,1) sumQuery
+          s <- Session.statement (1,1) sumStatement
           Session.sql "end;"
           return s
       in DSL.session session >>= \x -> assertEqual (show x) (Right 2) x
@@ -247,8 +247,8 @@
       actualIO =
         DSL.session $ do
           let
-            query =
-              Query.Query sql encoder decoder True
+            statement =
+              Statement.Statement sql encoder decoder True
               where
                 sql =
                   "select $1 = interval '10 seconds'"
@@ -256,7 +256,7 @@
                   (Decoders.singleRow (Decoders.column (Decoders.bool)))
                 encoder =
                   Encoders.param (Encoders.interval)
-            in DSL.query (10 :: DiffTime) query
+            in DSL.statement (10 :: DiffTime) statement
       in actualIO >>= \x -> assertEqual (show x) (Right True) x
     ,
     testCase "Interval Decoding" $
@@ -264,8 +264,8 @@
       actualIO =
         DSL.session $ do
           let
-            query =
-              Query.Query sql encoder decoder True
+            statement =
+              Statement.Statement sql encoder decoder True
               where
                 sql =
                   "select interval '10 seconds'"
@@ -273,7 +273,7 @@
                   (Decoders.singleRow (Decoders.column (Decoders.interval)))
                 encoder =
                   Encoders.unit
-            in DSL.query () query
+            in DSL.statement () statement
       in actualIO >>= \x -> assertEqual (show x) (Right (10 :: DiffTime)) x
     ,
     testCase "Interval Encoding/Decoding" $
@@ -281,8 +281,8 @@
       actualIO =
         DSL.session $ do
           let
-            query =
-              Query.Query sql encoder decoder True
+            statement =
+              Statement.Statement sql encoder decoder True
               where
                 sql =
                   "select $1"
@@ -290,7 +290,7 @@
                   (Decoders.singleRow (Decoders.column (Decoders.interval)))
                 encoder =
                   Encoders.param (Encoders.interval)
-            in DSL.query (10 :: DiffTime) query
+            in DSL.statement (10 :: DiffTime) statement
       in actualIO >>= \x -> assertEqual (show x) (Right (10 :: DiffTime)) x
     ,
     testCase "Unknown" $
@@ -298,22 +298,22 @@
       actualIO =
         DSL.session $ do
           let
-            query =
-              Query.Query sql mempty Decoders.unit True
+            statement =
+              Statement.Statement sql mempty Decoders.unit True
               where
                 sql =
                   "drop type if exists mood"
-            in DSL.query () query
+            in DSL.statement () statement
           let
-            query =
-              Query.Query sql mempty Decoders.unit True
+            statement =
+              Statement.Statement sql mempty Decoders.unit True
               where
                 sql =
                   "create type mood as enum ('sad', 'ok', 'happy')"
-            in DSL.query () query
+            in DSL.statement () statement
           let
-            query =
-              Query.Query sql encoder decoder True
+            statement =
+              Statement.Statement sql encoder decoder True
               where
                 sql =
                   "select $1 = ('ok' :: mood)"
@@ -321,7 +321,7 @@
                   (Decoders.singleRow (Decoders.column (Decoders.bool)))
                 encoder =
                   Encoders.param (Encoders.unknown)
-            in DSL.query "ok" query
+            in DSL.statement "ok" statement
       in actualIO >>= assertEqual "" (Right True)
     ,
     testCase "Textual Unknown" $
@@ -329,22 +329,22 @@
       actualIO =
         DSL.session $ do
           let
-            query =
-              Query.Query sql mempty Decoders.unit True
+            statement =
+              Statement.Statement sql mempty Decoders.unit True
               where
                 sql =
                   "create or replace function overloaded(a int, b int) returns int as $$ select a + b $$ language sql;"
-            in DSL.query () query
+            in DSL.statement () statement
           let
-            query =
-              Query.Query sql mempty Decoders.unit True
+            statement =
+              Statement.Statement sql mempty Decoders.unit True
               where
                 sql =
                   "create or replace function overloaded(a text, b text, c text) returns text as $$ select a || b || c $$ language sql;"
-            in DSL.query () query
+            in DSL.statement () statement
           let
-            query =
-              Query.Query sql encoder decoder True
+            statement =
+              Statement.Statement sql encoder decoder True
               where
                 sql =
                   "select overloaded($1, $2) || overloaded($3, $4, $5)"
@@ -352,7 +352,7 @@
                   (Decoders.singleRow (Decoders.column (Decoders.text)))
                 encoder =
                   contramany (Encoders.param Encoders.unknown)
-            in DSL.query ["1", "2", "4", "5", "6"] query
+            in DSL.statement ["1", "2", "4", "5", "6"] statement
       in actualIO >>= assertEqual "" (Right "3456")
     ,
     testCase "Enum" $
@@ -360,22 +360,22 @@
       actualIO =
         DSL.session $ do
           let
-            query =
-              Query.Query sql mempty Decoders.unit True
+            statement =
+              Statement.Statement sql mempty Decoders.unit True
               where
                 sql =
                   "drop type if exists mood"
-            in DSL.query () query
+            in DSL.statement () statement
           let
-            query =
-              Query.Query sql mempty Decoders.unit True
+            statement =
+              Statement.Statement sql mempty Decoders.unit True
               where
                 sql =
                   "create type mood as enum ('sad', 'ok', 'happy')"
-            in DSL.query () query
+            in DSL.statement () statement
           let
-            query =
-              Query.Query sql encoder decoder True
+            statement =
+              Statement.Statement sql encoder decoder True
               where
                 sql =
                   "select ($1 :: mood)"
@@ -383,7 +383,7 @@
                   (Decoders.singleRow (Decoders.column (Decoders.enum (Just . id))))
                 encoder =
                   Encoders.param (Encoders.enum id)
-            in DSL.query "ok" query
+            in DSL.statement "ok" statement
       in actualIO >>= assertEqual "" (Right "ok")
     ,
     testCase "The same prepared statement used on different types" $ 
@@ -392,10 +392,10 @@
         DSL.session $ do
           let
             effect1 =
-              DSL.query "ok" query
+              DSL.statement "ok" statement
               where
-                query =
-                  Query.Query sql encoder decoder True
+                statement =
+                  Statement.Statement sql encoder decoder True
                   where
                     sql =
                       "select $1"
@@ -404,10 +404,10 @@
                     decoder =
                       (Decoders.singleRow (Decoders.column (Decoders.text)))
             effect2 =
-              DSL.query 1 query
+              DSL.statement 1 statement
               where
-                query =
-                  Query.Query sql encoder decoder True
+                statement =
+                  Statement.Statement sql encoder decoder True
                   where
                     sql =
                       "select $1"
@@ -429,16 +429,16 @@
           deleteRows <* dropTable
         where
           dropTable =
-            DSL.query () $ Queries.plain $ 
+            DSL.statement () $ Statements.plain $ 
             "drop table if exists a"
           createTable =
-            DSL.query () $ Queries.plain $
+            DSL.statement () $ Statements.plain $
             "create table a (id bigserial not null, name varchar not null, primary key (id))"
           insertRow =
-            DSL.query () $ Queries.plain $
+            DSL.statement () $ Statements.plain $
             "insert into a (name) values ('a')"  
           deleteRows =
-            DSL.query () $ Query.Query sql def decoder False
+            DSL.statement () $ Statement.Statement sql def decoder False
             where
               sql =
                 "delete from a"
@@ -450,18 +450,18 @@
     let
       actualIO =
         DSL.session $ do
-          DSL.query () $ Queries.plain $ "drop table if exists a"
-          DSL.query () $ Queries.plain $ "create table a (id serial not null, v char not null, primary key (id))"
-          id1 <- DSL.query () $ Query.Query "insert into a (v) values ('a') returning id" def (Decoders.singleRow (Decoders.column Decoders.int4)) False
-          id2 <- DSL.query () $ Query.Query "insert into a (v) values ('b') returning id" def (Decoders.singleRow (Decoders.column Decoders.int4)) False
-          DSL.query () $ Queries.plain $ "drop table if exists a"
+          DSL.statement () $ Statements.plain $ "drop table if exists a"
+          DSL.statement () $ Statements.plain $ "create table a (id serial not null, v char not null, primary key (id))"
+          id1 <- DSL.statement () $ Statement.Statement "insert into a (v) values ('a') returning id" def (Decoders.singleRow (Decoders.column Decoders.int4)) False
+          id2 <- DSL.statement () $ Statement.Statement "insert into a (v) values ('b') returning id" def (Decoders.singleRow (Decoders.column Decoders.int4)) False
+          DSL.statement () $ Statements.plain $ "drop table if exists a"
           pure (id1, id2)
       in assertEqual "" (Right (1, 2)) =<< actualIO
     ,
     testCase "List decoding" $
     let
       actualIO =
-        DSL.session $ DSL.query () $ Queries.selectList
+        DSL.session $ DSL.statement () $ Statements.selectList
       in assertEqual "" (Right [(1, 2), (3, 4), (5, 6)]) =<< actualIO 
   ]
 
diff --git a/tasty/Main/Connection.hs b/tasty/Main/Connection.hs
--- a/tasty/Main/Connection.hs
+++ b/tasty/Main/Connection.hs
@@ -3,7 +3,7 @@
 
 import Main.Prelude
 import qualified Hasql.Connection as HC
-import qualified Hasql.Query as HQ
+import qualified Hasql.Statement as HQ
 import qualified Hasql.Session
 
 
diff --git a/tasty/Main/DSL.hs b/tasty/Main/DSL.hs
--- a/tasty/Main/DSL.hs
+++ b/tasty/Main/DSL.hs
@@ -3,14 +3,14 @@
   Session,
   SessionError(..),
   session,
-  Hasql.Session.query,
+  Hasql.Session.statement,
   Hasql.Session.sql,
 )
 where
 
 import Main.Prelude
 import qualified Hasql.Connection as HC
-import qualified Hasql.Query as HQ
+import qualified Hasql.Statement as HQ
 import qualified Hasql.Encoders as HE
 import qualified Hasql.Decoders as HD
 import qualified Hasql.Session
diff --git a/tasty/Main/Queries.hs b/tasty/Main/Queries.hs
deleted file mode 100644
--- a/tasty/Main/Queries.hs
+++ /dev/null
@@ -1,36 +0,0 @@
-module Main.Queries where
-
-import Main.Prelude hiding (def)
-import qualified Hasql.Query as HQ
-import qualified Hasql.Encoders as HE
-import qualified Hasql.Decoders as HD
-import qualified Main.Prelude as Prelude
-
-
-def :: ByteString -> HQ.Query () ()
-def sql =
-  HQ.Query sql Prelude.def Prelude.def False
-
-plain :: ByteString -> HQ.Query () ()
-plain sql =
-  HQ.Query sql mempty HD.unit False
-
-dropType :: ByteString -> HQ.Query () ()
-dropType name =
-  plain $
-    "drop type if exists " <> name
-
-createEnum :: ByteString -> [ByteString] -> HQ.Query () ()
-createEnum name values =
-  plain $
-    "create type " <> name <> " as enum (" <> 
-    mconcat (intersperse ", " (map (\x -> "'" <> x <> "'") values)) <> ")"
-
-selectList :: HQ.Query () ([] (Int64, Int64))
-selectList =
-  HQ.Query sql mempty decoder True
-  where
-    sql =
-      "values (1,2), (3,4), (5,6)"
-    decoder =
-      HD.rowList ((,) <$> HD.column HD.int8 <*> HD.column HD.int8)
diff --git a/tasty/Main/Statements.hs b/tasty/Main/Statements.hs
new file mode 100644
--- /dev/null
+++ b/tasty/Main/Statements.hs
@@ -0,0 +1,36 @@
+module Main.Statements where
+
+import Main.Prelude hiding (def)
+import qualified Hasql.Statement as HQ
+import qualified Hasql.Encoders as HE
+import qualified Hasql.Decoders as HD
+import qualified Main.Prelude as Prelude
+
+
+def :: ByteString -> HQ.Statement () ()
+def sql =
+  HQ.Statement sql Prelude.def Prelude.def False
+
+plain :: ByteString -> HQ.Statement () ()
+plain sql =
+  HQ.Statement sql mempty HD.unit False
+
+dropType :: ByteString -> HQ.Statement () ()
+dropType name =
+  plain $
+    "drop type if exists " <> name
+
+createEnum :: ByteString -> [ByteString] -> HQ.Statement () ()
+createEnum name values =
+  plain $
+    "create type " <> name <> " as enum (" <> 
+    mconcat (intersperse ", " (map (\x -> "'" <> x <> "'") values)) <> ")"
+
+selectList :: HQ.Statement () ([] (Int64, Int64))
+selectList =
+  HQ.Statement sql mempty decoder True
+  where
+    sql =
+      "values (1,2), (3,4), (5,6)"
+    decoder =
+      HD.rowList ((,) <$> HD.column HD.int8 <*> HD.column HD.int8)
diff --git a/threads-test/Main.hs b/threads-test/Main.hs
--- a/threads-test/Main.hs
+++ b/threads-test/Main.hs
@@ -2,11 +2,11 @@
 
 import Rebase.Prelude
 import qualified Hasql.Connection
-import qualified Hasql.Query
+import qualified Hasql.Statement
 import qualified Hasql.Encoders
 import qualified Hasql.Decoders
 import qualified Hasql.Session
-import qualified Main.Queries as Queries
+import qualified Main.Statements as Statements
 
 
 main =
@@ -29,13 +29,13 @@
         forkIO $ do
           traceM "1: in"
           putMVar beginVar ()
-          session connection1 (Hasql.Session.query 0.2 Queries.selectSleep)
+          session connection1 (Hasql.Session.statement 0.2 Statements.selectSleep)
           traceM "1: out"
           void (tryPutMVar finishVar False)
         forkIO $ do
           takeMVar beginVar
           traceM "2: in"
-          session connection2 (Hasql.Session.query 0.1 Queries.selectSleep)
+          session connection2 (Hasql.Session.statement 0.1 Statements.selectSleep)
           traceM "2: out"
           void (tryPutMVar finishVar True)
         bool exitFailure exitSuccess . traceShowId =<< takeMVar finishVar
diff --git a/threads-test/Main/Queries.hs b/threads-test/Main/Queries.hs
deleted file mode 100644
--- a/threads-test/Main/Queries.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-module Main.Queries where
-
-import Rebase.Prelude
-import Hasql.Query
-import qualified Hasql.Encoders as E
-import qualified Hasql.Decoders as D
-
-
-selectSleep :: Query Double ()
-selectSleep =
-  Query sql encoder decoder True
-  where
-    sql =
-      "select pg_sleep($1)"
-    encoder =
-      E.param E.float8
-    decoder =
-      D.unit
-
-
diff --git a/threads-test/Main/Statements.hs b/threads-test/Main/Statements.hs
new file mode 100644
--- /dev/null
+++ b/threads-test/Main/Statements.hs
@@ -0,0 +1,20 @@
+module Main.Statements where
+
+import Rebase.Prelude
+import Hasql.Statement
+import qualified Hasql.Encoders as E
+import qualified Hasql.Decoders as D
+
+
+selectSleep :: Statement Double ()
+selectSleep =
+  Statement sql encoder decoder True
+  where
+    sql =
+      "select pg_sleep($1)"
+    encoder =
+      E.param E.float8
+    decoder =
+      D.unit
+
+
