diff --git a/hasql.cabal b/hasql.cabal
--- a/hasql.cabal
+++ b/hasql.cabal
@@ -1,7 +1,7 @@
 name:
   hasql
 version:
-  0.3.0
+  0.4.0
 synopsis:
   A minimalistic general high level API for relational databases
 description:
@@ -104,19 +104,16 @@
     time >= 1.4 && < 1.6,
     bytestring == 0.10.*,
     text >= 1.0 && < 1.3,
-    -- control:
-    list-t >= 0.2.4 && < 0.4,
-    monad-control == 0.3.*,
-    transformers-base == 0.4.*,
     -- errors:
     loch-th == 0.2.*,
     placeholders == 0.1.*,
     -- general:
-    monad-control == 0.3.*,
-    transformers-base == 0.4.*,
     safe == 0.3.*,
+    list-t >= 0.3 && < 0.4,
     mmorph == 1.0.*,
-    mtl-prelude < 3,
+    monad-control == 0.3.*,
+    transformers-base == 0.4.*,
+    transformers >= 0.3 && < 0.5,
     base-prelude >= 0.1.3 && < 0.2,
     base >= 4.5 && < 4.8
 
@@ -162,8 +159,6 @@
   build-depends:
     hasql,
     hasql-postgres == 0.7.*,
-    scientific == 0.3.*,
-    transformers >= 0.2 && < 0.5,
     mtl-prelude < 3,
     base-prelude == 0.1.*,
     HTF == 0.12.*,
@@ -190,7 +185,7 @@
   build-depends:
     hasql,
     hasql-postgres == 0.7.*,
-    transformers >= 0.2 && < 0.5,
+    transformers >= 0.3 && < 0.5,
     base >= 4.5 && < 4.8
 
 
diff --git a/library/Hasql.hs b/library/Hasql.hs
--- a/library/Hasql.hs
+++ b/library/Hasql.hs
@@ -279,12 +279,13 @@
 newtype TxListT s m r =
   TxListT (ListT.ListT m r)
   deriving (Functor, Applicative, Alternative, Monad, MonadTrans, MonadPlus, 
-            Monoid, ListT.ListMonad)
+            Monoid, ListT.MonadCons)
 
-instance ListT.ListTrans (TxListT s) where
+instance ListT.MonadTransUncons (TxListT s) where
   uncons = 
-    unsafeCoerce 
-      (ListT.uncons :: ListT.ListT m r -> m (Maybe (r, ListT.ListT m r)))
+    (liftM . fmap . fmap) (unsafeCoerce :: ListT.ListT m r -> TxListT s m r) .
+    ListT.uncons . 
+    (unsafeCoerce :: TxListT s m r -> ListT.ListT m r)
 
 
 -- * Statements execution
diff --git a/library/Hasql/Prelude.hs b/library/Hasql/Prelude.hs
--- a/library/Hasql/Prelude.hs
+++ b/library/Hasql/Prelude.hs
@@ -11,9 +11,13 @@
 -------------------------
 import BasePrelude as Exports
 
--- mtl-prelude
+-- transformers
 -------------------------
-import MTLPrelude as Exports hiding (shift)
+import Control.Monad.Trans.State.Strict as Exports hiding (liftCallCC, liftCatch)
+import Control.Monad.Trans.Reader as Exports hiding (liftCallCC, liftCatch)
+import Control.Monad.Trans.Class as Exports
+import Control.Monad.IO.Class as Exports
+import Data.Functor.Identity as Exports
 
 -- mmorph
 -------------------------
diff --git a/library/Hasql/QParser.hs b/library/Hasql/QParser.hs
--- a/library/Hasql/QParser.hs
+++ b/library/Hasql/QParser.hs
@@ -12,16 +12,16 @@
 
 parse :: Text -> Either String Result
 parse = 
-  parseOnly countPlaceholders
+  parseOnly $ flip execStateT 0 $
+    statement *>
+    (lift endOfInput <|> 
+     (void (lift (char ';')) <* fail "A semicolon detected. Only single statements are allowed"))
   where
-    countPlaceholders =
-      count <|> pure 0
-      where
-        count =
-          do
-            many $ void stringLit <|> void (notChar '?')
-            char '?'
-            fmap succ countPlaceholders
+    statement =
+      skipMany1 $ 
+        void (lift stringLit) <|> 
+        void (lift (char '?') <* modify succ) <|>
+        void (lift (notChar ';'))
 
 stringLit :: Parser Text
 stringLit =
