diff --git a/hasql-th.cabal b/hasql-th.cabal
--- a/hasql-th.cabal
+++ b/hasql-th.cabal
@@ -1,5 +1,5 @@
 name: hasql-th
-version: 0.4
+version: 0.4.0.1
 category: Hasql, Database, PostgreSQL, Template Haskell
 synopsis: Template Haskell utilities for Hasql
 description:
@@ -60,9 +60,9 @@
     parser-combinators >=1.1 && <1.3,
     selective >=0.3 && <0.4,
     template-haskell >=2.8 && <3,
+    template-haskell-compat-v0208 >=0.1.2 && <2,
     text >=1 && <2,
     text-builder >=0.6.6.1 && <0.7,
-    tuple-th >=0.2.5 && <0.3,
     unordered-containers >=0.2.10 && <0.3,
     uuid >=1.3 && <2,
     vector >=0.12 && <0.13
diff --git a/library/Hasql/TH.hs b/library/Hasql/TH.hs
--- a/library/Hasql/TH.hs
+++ b/library/Hasql/TH.hs
@@ -21,8 +21,43 @@
   As you can see, it completely eliminates the need to mess with codecs.
   The quasiquoters directly produce `Statement`,
   which you can then `dimap` over using its `Profunctor` instance to get to your domain types.
+  
+  == Type mappings
+  
+  === Primitives
+  
+  Following is a list of supported Postgres types and their according types on the Haskell end.
 
-  === Nullability
+  - @bool@ - `Bool`
+  - @int2@ - `Int16`
+  - @int4@ - `Int32`
+  - @int8@ - `Int64`
+  - @float4@ - `Float`
+  - @float8@ - `Double`
+  - @numeric@ - `Data.Scientific.Scientific`
+  - @char@ - `Char`
+  - @text@ - `Data.Text.Text`
+  - @bytea@ - `Data.ByteString.ByteString`
+  - @date@ - `Data.Time.Day`
+  - @timestamp@ - `Data.Time.LocalTime`
+  - @timestamptz@ - `Data.Time.UTCTime`
+  - @time@ - `Data.Time.TimeOfDay`
+  - @timetz@ - @(`Data.Time.TimeOfDay`, `Data.Time.TimeZone`)@
+  - @interval@ - `Data.Time.DiffTime`
+  - @uuid@ - `Data.UUID.UUID`
+  - @inet@ - @(`Network.IP.Addr.NetAddr` `Network.IP.Addr.IP`)@
+  - @json@ - `Data.Aeson.Value`
+  - @jsonb@ - `Data.Aeson.Value`
+  
+  === Arrays
+
+  Array mappings are also supported.
+  They are specified according to Postgres syntax: by appending one or more @[]@ to the primitive type,
+  depending on how many dimensions the array has.
+  On the Haskell end array is mapped to generic `Data.Vector.Generic.Base.Vector`,
+  allowing you to choose which particular vector implementation to map to.
+
+  === Nulls
 
   As you might have noticed in the example,
   we introduce one change to the Postgres syntax in the way
diff --git a/library/Hasql/TH/Exp.hs b/library/Hasql/TH/Exp.hs
--- a/library/Hasql/TH/Exp.hs
+++ b/library/Hasql/TH/Exp.hs
@@ -1,7 +1,7 @@
 module Hasql.TH.Exp where
 
 import Hasql.TH.Prelude hiding (sequence_, string, list)
-import Language.Haskell.TH
+import Language.Haskell.TH.Syntax
 import qualified Hasql.TH.Prelude as Prelude
 import qualified Hasql.TH.Syntax.Extraction as Extraction
 import qualified Hasql.Encoders as Encoders
@@ -11,7 +11,7 @@
 import qualified Data.ByteString.Unsafe as ByteString
 import qualified Data.List.NonEmpty as NonEmpty
 import qualified Data.Vector.Generic as Vector
-import qualified TupleTH
+import qualified TemplateHaskell.Compat.V0208 as Compat
 
 
 -- * Helpers
@@ -58,7 +58,14 @@
 tuple = ConE . tupleDataName
 
 splitTupleAt :: Int -> Int -> Exp
-splitTupleAt arity position = unsafePerformIO $ runQ $ TupleTH.splitTupleAt arity position
+splitTupleAt arity position = let
+  nameByIndex index = Name (OccName ('_' : show index)) NameS
+  names = enumFromTo 0 (pred arity) & map nameByIndex
+  pats = names & map VarP
+  pat = TupP pats
+  exps = names & map VarE
+  body = splitAt position exps & \ (a, b) -> Compat.tupE [Compat.tupE a, Compat.tupE b]
+  in LamE [pat] body
 
 {-|
 Given a list of divisible functor expressions,
diff --git a/library/Hasql/TH/Syntax/Extraction.hs b/library/Hasql/TH/Syntax/Extraction.hs
--- a/library/Hasql/TH/Syntax/Extraction.hs
+++ b/library/Hasql/TH/Syntax/Extraction.hs
@@ -66,7 +66,6 @@
   "inet" -> Right 'Encoders.inet
   "json" -> Right 'Encoders.json
   "jsonb" -> Right 'Encoders.jsonb
-  "enum" -> Right 'Encoders.enum
   name -> Left ("No value encoder exists for type: " <> name)
 
 decoder :: TypecastTypename -> Either Text Decoder
@@ -97,7 +96,6 @@
   "inet" -> Right 'Decoders.inet
   "json" -> Right 'Decoders.json
   "jsonb" -> Right 'Decoders.jsonb
-  "enum" -> Right 'Decoders.enum
   name -> Left ("No value decoder exists for type: " <> name)
 
 identText :: Ident -> Either Text Text
diff --git a/test/Main/Gen.hs b/test/Main/Gen.hs
--- a/test/Main/Gen.hs
+++ b/test/Main/Gen.hs
@@ -539,7 +539,7 @@
 whenClause = WhenClause <$> small aExpr <*> small aExpr
 
 inExpr = choice [
-    SelectInExpr <$> selectWithParens,
+    SelectInExpr <$> NoParensSelectWithParens <$> selectNoParens,
     ExprListInExpr <$> exprList
   ]
 
