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.7.1.1
+  0.7.1.2
 category:
   Hasql, Database, PostgreSQL
 synopsis:
diff --git a/library/Hasql/Pool.hs b/library/Hasql/Pool.hs
--- a/library/Hasql/Pool.hs
+++ b/library/Hasql/Pool.hs
@@ -1,10 +1,11 @@
 module Hasql.Pool
-  ( -- * --
+  ( -- * Pool
     Pool,
     acquire,
     release,
     use,
-    -- * --
+
+    -- * Errors
     UsageError (..),
   )
 where
@@ -29,6 +30,9 @@
   }
 
 -- | Given the pool-size and connection settings create a connection-pool.
+--
+-- No connections actually get established by this function. It is delegated
+-- to 'use'.
 acquire :: Int -> Connection.Settings -> IO Pool
 acquire poolSize connectionSettings = do
   Pool connectionSettings
@@ -36,8 +40,7 @@
     <*> newTVarIO poolSize
     <*> newTVarIO True
 
--- |
--- Release all the connections in the pool.
+-- | Release all the connections in the pool.
 release :: Pool -> IO ()
 release Pool {..} = do
   connections <- atomically $ do
@@ -47,7 +50,7 @@
 
 -- | Use a connection from the pool to run a session and return the connection
 -- to the pool, when finished.
--- 
+--
 -- Session failing with a 'Session.ClientError' get interpreted as a loss of
 -- connection. In such case the connection does not get returned to the pool
 -- and a slot gets freed up for a new connection to be established the next
@@ -91,10 +94,12 @@
           returnConn
           return $ Right res
       where
-        returnConn = do
-          atomically $ do
+        returnConn =
+          join . atomically $ do
             alive <- readTVar poolAlive
-            when alive $ writeTQueue poolConnectionQueue conn
+            if alive
+              then writeTQueue poolConnectionQueue conn $> return ()
+              else return $ Connection.release conn
 
 -- |
 -- A union over the connection establishment error and the session error.
