diff --git a/hasql-pool.cabal b/hasql-pool.cabal
--- a/hasql-pool.cabal
+++ b/hasql-pool.cabal
@@ -1,7 +1,7 @@
 name:
   hasql-pool
 version:
-  0.3
+  0.4
 category:
   Hasql, Database, PostgreSQL
 synopsis:
@@ -38,20 +38,19 @@
     library
   ghc-options:
   default-extensions:
-    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, ImpredicativeTypes, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
+    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
   default-language:
     Haskell2010
   other-modules:
     Hasql.Pool.Prelude
   exposed-modules:
     Hasql.Pool
-    Hasql.Pool.Handle
   build-depends:
     -- resources:
     resource-pool >= 0.2 && < 0.3,
     -- database:
     hasql >= 0.19 && < 0.20,
     -- data:
-    time >= 1.4 && < 2,
+    time >= 1.5 && < 2,
     -- general:
-    base-prelude >= 0.1.19 && < 0.2
+    base-prelude >= 0.1.21 && < 0.2
diff --git a/library/Hasql/Pool.hs b/library/Hasql/Pool.hs
--- a/library/Hasql/Pool.hs
+++ b/library/Hasql/Pool.hs
@@ -1,14 +1,17 @@
 module Hasql.Pool
 (
   Pool,
+  Settings(..),
   acquire,
   release,
+  UsageError(..),
   use,
 )
 where
 
 import Hasql.Pool.Prelude
 import qualified Hasql.Connection
+import qualified Hasql.Session
 import qualified Data.Pool
 
 
@@ -18,10 +21,24 @@
   Pool (Data.Pool.Pool (Either Hasql.Connection.ConnectionError Hasql.Connection.Connection))
 
 -- |
+-- Settings of the connection pool. Consist of:
+-- 
+-- * Pool-size.
+-- 
+-- * Timeout.   
+-- An amount of time for which an unused resource is kept open.
+-- The smallest acceptable value is 0.5 seconds.
+-- 
+-- * Connection settings.
+-- 
+type Settings =
+  (Int, NominalDiffTime, Hasql.Connection.Settings)
+
+-- |
 -- Given the pool-size, timeout and connection settings
 -- create a connection-pool.
-acquire :: Int -> NominalDiffTime -> Hasql.Connection.Settings -> IO Pool
-acquire size timeout connectionSettings =
+acquire :: Settings -> IO Pool
+acquire (size, timeout, connectionSettings) =
   fmap Pool $
   Data.Pool.createPool acquire release stripes timeout size
   where
@@ -39,9 +56,18 @@
   Data.Pool.destroyAllResources pool
 
 -- |
--- Use a connection from the pool and return it to the pool, when finished.
--- Exception-safe.
-use :: Pool -> (Hasql.Connection.Connection -> IO a) -> IO (Either Hasql.Connection.ConnectionError a)
-use (Pool pool) handler =
-  Data.Pool.withResource pool (traverse handler)
+-- A union over the connection establishment error and the session error.
+data UsageError =
+  ConnectionError !Hasql.Connection.ConnectionError |
+  SessionError !Hasql.Session.Error
+  deriving (Show, Eq)
 
+-- |
+-- Use a connection from the pool to run a session and
+-- return the connection to the pool, when finished.
+use :: Pool -> Hasql.Session.Session a -> IO (Either UsageError a)
+use (Pool pool) session =
+  fmap (either (Left . ConnectionError) (either (Left . SessionError) Right)) $
+  Data.Pool.withResource pool $
+  traverse $ 
+  Hasql.Session.run session
diff --git a/library/Hasql/Pool/Handle.hs b/library/Hasql/Pool/Handle.hs
deleted file mode 100644
--- a/library/Hasql/Pool/Handle.hs
+++ /dev/null
@@ -1,56 +0,0 @@
--- |
--- Handle-pattern API.
-module Hasql.Pool.Handle
-(
-  Handle,
-  with,
-  -- * Usage
-  Error(..),
-  session,
-)
-where
-
-import Hasql.Pool.Prelude hiding (Handle)
-import qualified Hasql.Pool
-import qualified Hasql.Connection
-import qualified Hasql.Session
-
-
--- |
--- A temporary handle to the pool. 
-newtype Handle s =
-  Handle (forall a. Hasql.Session.Session a -> IO (Either Error a))
-
--- |
--- Given the pool-size, timeout and connection settings
--- executes an IO function on a temporary handle,
--- releasing it automatically afterwards.
-with :: Int -> NominalDiffTime -> Hasql.Connection.Settings -> (forall s. Handle s -> IO a) -> IO a
-with size timeout settings handler =
-  acquire >>= \pool -> use pool <* release pool
-  where
-    acquire =
-      Hasql.Pool.acquire size timeout settings
-    use pool =
-      handler $ Handle $ \session -> 
-        fmap (either (Left . Left) (either (Left . Right) Right)) $
-        Hasql.Pool.use pool $
-        Hasql.Session.run session
-    release pool =
-      Hasql.Pool.release pool
-
-
--- * Usage
--------------------------
-
--- |
--- Error of executing a session on a connection from the pool.
-type Error =
-  Either Hasql.Connection.ConnectionError Hasql.Session.Error
-
--- |
--- Executes a session on a connection from the pool,
--- using the provided temporary handle to it.
-session :: Handle s -> Hasql.Session.Session a -> IO (Either Error a)
-session (Handle runSession) session =
-  runSession session
