diff --git a/Database/PostgreSQL/Typed/Dynamic.hs b/Database/PostgreSQL/Typed/Dynamic.hs
--- a/Database/PostgreSQL/Typed/Dynamic.hs
+++ b/Database/PostgreSQL/Typed/Dynamic.hs
@@ -105,10 +105,10 @@
 -- Unlike most other TH functions, this does not require any database connection.
 pgSubstituteLiterals :: String -> TH.ExpQ
 pgSubstituteLiterals sql = TH.AppE (TH.VarE 'BS.concat) . TH.ListE <$> ssl (sqlSplitExprs sql) where
-  ssl :: SQLSplit String True -> TH.Q [TH.Exp]
+  ssl :: SQLSplit String 'True -> TH.Q [TH.Exp]
   ssl (SQLLiteral s l) = (TH.VarE 'fromString `TH.AppE` stringE s :) <$> ssp l
   ssl SQLSplitEnd = return []
-  ssp :: SQLSplit String False -> TH.Q [TH.Exp]
+  ssp :: SQLSplit String 'False -> TH.Q [TH.Exp]
   ssp (SQLPlaceholder e l) = do
     v <- either (fail . (++) ("Failed to parse expression {" ++ e ++ "}: ")) return $ parseExp e
     (TH.VarE 'pgSafeLiteral `TH.AppE` v :) <$> ssl l
diff --git a/Database/PostgreSQL/Typed/Internal.hs b/Database/PostgreSQL/Typed/Internal.hs
--- a/Database/PostgreSQL/Typed/Internal.hs
+++ b/Database/PostgreSQL/Typed/Internal.hs
@@ -21,15 +21,15 @@
   fromString = stringE
 
 data SQLSplit a (literal :: Bool) where
-  SQLLiteral :: String -> SQLSplit a False -> SQLSplit a True
-  SQLPlaceholder :: a -> SQLSplit a True -> SQLSplit a False
+  SQLLiteral :: String -> SQLSplit a 'False -> SQLSplit a 'True
+  SQLPlaceholder :: a -> SQLSplit a 'True -> SQLSplit a 'False
   SQLSplitEnd :: SQLSplit a any
 
-sqlCons :: Char -> SQLSplit a True -> SQLSplit a True
+sqlCons :: Char -> SQLSplit a 'True -> SQLSplit a 'True
 sqlCons c (SQLLiteral s l) = SQLLiteral (c : s) l
 sqlCons c SQLSplitEnd = SQLLiteral [c] SQLSplitEnd
 
-sqlSplitExprs :: String -> SQLSplit String True
+sqlSplitExprs :: String -> SQLSplit String 'True
 sqlSplitExprs ('$':'$':'{':s) = sqlCons '$' $ sqlCons '{' $ sqlSplitExprs s
 sqlSplitExprs ('$':'{':s)
   | (e, '}':r) <- break (\c -> c == '{' || c == '}') s = SQLLiteral "" $ SQLPlaceholder e $ sqlSplitExprs r
@@ -37,7 +37,7 @@
 sqlSplitExprs (c:s) = sqlCons c $ sqlSplitExprs s
 sqlSplitExprs [] = SQLSplitEnd
 
-sqlSplitParams :: String -> SQLSplit Int True
+sqlSplitParams :: String -> SQLSplit Int 'True
 sqlSplitParams ('$':'$':d:s) | isDigit d = sqlCons '$' $ sqlCons d $ sqlSplitParams s
 sqlSplitParams ('$':s@(d:_)) | isDigit d, [(n, r)] <- readDec s = SQLLiteral "" $ SQLPlaceholder n $ sqlSplitParams r
 sqlSplitParams (c:s) = sqlCons c $ sqlSplitParams s
diff --git a/Database/PostgreSQL/Typed/Query.hs b/Database/PostgreSQL/Typed/Query.hs
--- a/Database/PostgreSQL/Typed/Query.hs
+++ b/Database/PostgreSQL/Typed/Query.hs
@@ -118,10 +118,10 @@
 -- Embedded expressions may not contain @{@ or @}@.
 sqlPlaceholders :: String -> (String, [String])
 sqlPlaceholders = ssl 1 . sqlSplitExprs where
-  ssl :: Int -> SQLSplit String True -> (String, [String])
+  ssl :: Int -> SQLSplit String 'True -> (String, [String])
   ssl n (SQLLiteral s l) = first (s ++) $ ssp n l
   ssl _ SQLSplitEnd = ("", [])
-  ssp :: Int -> SQLSplit String False -> (String, [String])
+  ssp :: Int -> SQLSplit String 'False -> (String, [String])
   ssp n (SQLPlaceholder e l) = (('$':show n) ++) *** (e :) $ ssl (succ n) l
   ssp _ SQLSplitEnd = ("", [])
 
diff --git a/Database/PostgreSQL/Typed/TH.hs b/Database/PostgreSQL/Typed/TH.hs
--- a/Database/PostgreSQL/Typed/TH.hs
+++ b/Database/PostgreSQL/Typed/TH.hs
@@ -76,11 +76,9 @@
 
 tpgLoadTypes :: TPGState -> IO TPGState
 tpgLoadTypes tpg = do
-  -- defer loading types until they're needed
-  tl <- unsafeInterleaveIO $ pgSimpleQuery (tpgConnection tpg) $ BSLC.pack "SELECT typ.oid, format_type(CASE WHEN typtype = 'd' THEN typbasetype ELSE typ.oid END, -1) FROM pg_catalog.pg_type typ JOIN pg_catalog.pg_namespace nsp ON typnamespace = nsp.oid WHERE nspname <> 'pg_toast' AND nspname <> 'information_schema' ORDER BY typ.oid"
-  return $ tpg{ tpgTypes = IntMap.fromAscList $ map (\[to, tn] ->
-    (fromIntegral (pgDecodeRep to :: OID), pgDecodeRep tn)) $ snd tl
-  }
+  t <- IntMap.fromAscList . map (\[to, tn] -> (fromIntegral (pgDecodeRep to :: OID), pgDecodeRep tn)) .
+    snd <$> pgSimpleQuery (tpgConnection tpg) (BSLC.pack "SELECT typ.oid, format_type(CASE WHEN typtype = 'd' THEN typbasetype ELSE typ.oid END, -1) FROM pg_catalog.pg_type typ JOIN pg_catalog.pg_namespace nsp ON typnamespace = nsp.oid WHERE nspname <> 'pg_toast' AND nspname <> 'information_schema' ORDER BY typ.oid")
+  return tpg{ tpgTypes = t }
 
 tpgInit :: PGConnection -> IO TPGState
 tpgInit c = tpgLoadTypes TPGState{ tpgConnection = c, tpgTypes = undefined }
diff --git a/Database/PostgreSQL/Typed/Types.hs b/Database/PostgreSQL/Typed/Types.hs
--- a/Database/PostgreSQL/Typed/Types.hs
+++ b/Database/PostgreSQL/Typed/Types.hs
@@ -318,17 +318,17 @@
   pgDecode _ = BSU.toString
   BIN_DEC((T.unpack .) . binDec BinD.text)
 
-instance PGStringType t => PGParameter t BS.ByteString where
+instance {-# OVERLAPPABLE #-} PGStringType t => PGParameter t BS.ByteString where
   pgEncode _ = id
   BIN_ENC(BinE.text . Left . TE.decodeUtf8)
-instance PGStringType t => PGColumn t BS.ByteString where
+instance {-# OVERLAPPABLE #-} PGStringType t => PGColumn t BS.ByteString where
   pgDecode _ = id
   BIN_DEC((TE.encodeUtf8 .) . binDec BinD.text)
 
-instance PGStringType t => PGParameter t BSL.ByteString where
+instance {-# OVERLAPPABLE #-} PGStringType t => PGParameter t BSL.ByteString where
   pgEncode _ = BSL.toStrict
   BIN_ENC(BinE.text . Right . TLE.decodeUtf8)
-instance PGStringType t => PGColumn t BSL.ByteString where
+instance {-# OVERLAPPABLE #-} PGStringType t => PGColumn t BSL.ByteString where
   pgDecode _ = BSL.fromStrict
   BIN_DEC((BSL.fromStrict .) . (TE.encodeUtf8 .) . binDec BinD.text)
 
@@ -373,18 +373,18 @@
   unhex = fromIntegral . digitToInt . w2c
 
 instance PGType "bytea" where BIN_COL
-instance PGParameter "bytea" BSL.ByteString where
+instance {-# OVERLAPPING #-} PGParameter "bytea" BSL.ByteString where
   pgEncode _ = encodeBytea . BSB.lazyByteStringHex
   pgLiteral t = pgQuoteUnsafe . pgEncode t
   BIN_ENC(BinE.bytea . Right)
-instance PGColumn "bytea" BSL.ByteString where
+instance {-# OVERLAPPING #-} PGColumn "bytea" BSL.ByteString where
   pgDecode _ = BSL.pack . decodeBytea
   BIN_DEC((BSL.fromStrict .) . binDec BinD.bytea)
-instance PGParameter "bytea" BS.ByteString where
+instance {-# OVERLAPPING #-} PGParameter "bytea" BS.ByteString where
   pgEncode _ = encodeBytea . BSB.byteStringHex
   pgLiteral t = pgQuoteUnsafe . pgEncode t
   BIN_ENC(BinE.bytea . Left)
-instance PGColumn "bytea" BS.ByteString where
+instance {-# OVERLAPPING #-} PGColumn "bytea" BS.ByteString where
   pgDecode _ = BS.pack . decodeBytea
   BIN_DEC(binDec BinD.bytea)
 
diff --git a/postgresql-typed.cabal b/postgresql-typed.cabal
--- a/postgresql-typed.cabal
+++ b/postgresql-typed.cabal
@@ -1,12 +1,12 @@
 Name:          postgresql-typed
-Version:       0.4.0
+Version:       0.4.1
 Cabal-Version: >= 1.8
 License:       BSD3
 License-File:  COPYING
 Copyright:     2010-2013 Chris Forno, 2014-2015 Dylan Simon
 Author:        Dylan Simon
 Maintainer:    Dylan Simon <dylan-pgtyped@dylex.net>
-Stability:     alpha
+Stability:     beta
 Bug-Reports:   https://github.com/dylex/postgresql-typed/issues
 Homepage:      https://github.com/dylex/postgresql-typed
 Category:      Database
