diff --git a/postgresql-simple.cabal b/postgresql-simple.cabal
--- a/postgresql-simple.cabal
+++ b/postgresql-simple.cabal
@@ -1,5 +1,5 @@
 Name:                postgresql-simple
-Version:             0.0.2
+Version:             0.0.3
 Synopsis:            Mid-Level PostgreSQL client library
 Description:
     Mid-Level PostgreSQL client library, forked from mysql-simple.
@@ -53,4 +53,4 @@
 source-repository this
   type:     git
   location: http://github.com/lpsmith/postgresql-simple
-  tag:      v0.0.2
+  tag:      v0.0.3
diff --git a/src/Database/PostgreSQL/Simple/Internal.hs b/src/Database/PostgreSQL/Simple/Internal.hs
--- a/src/Database/PostgreSQL/Simple/Internal.hs
+++ b/src/Database/PostgreSQL/Simple/Internal.hs
@@ -1,5 +1,23 @@
 {-# LANGUAGE OverloadedStrings, NamedFieldPuns, RecordWildCards #-}
 {-# LANGUAGE DeriveDataTypeable #-}
+------------------------------------------------------------------------------
+-- |
+-- Module:      Database.PostgreSQL.Simple.Internal
+-- Copyright:   (c) 2011 Leon P Smith
+-- License:     BSD3
+-- Maintainer:  Leon P Smith <leon@melding-monads.com>
+-- Stability:   experimental
+-- Portability: portable
+--
+-- Internal bits.  This interface is less stable and can change at any time.
+-- In particular this means that while the rest of the postgresql-simple 
+-- package endeavors to follow the package versioning policy,  this module 
+-- does not.  Also, at the moment there are things in here that aren't 
+-- particularly internal and are exported elsewhere;  these will eventually 
+-- disappear from this module.
+--
+------------------------------------------------------------------------------
+
 module Database.PostgreSQL.Simple.Internal where
 
 import Prelude hiding (catch)
@@ -15,8 +33,6 @@
 import           Database.PostgreSQL.LibPQ(Oid(..))
 import qualified Database.PostgreSQL.LibPQ as PQ
 import           Database.PostgreSQL.Simple.BuiltinTypes (BuiltinType)
-import           Foreign.ForeignPtr (newForeignPtr_, unsafeForeignPtrToPtr)
-import           Foreign.Ptr (nullPtr)
 import           System.IO.Unsafe (unsafePerformIO)
 
 -- | A Field represents metadata about a particular field
@@ -75,6 +91,24 @@
     , connectDatabase :: String
     } deriving (Eq,Read,Show,Typeable)
 
+-- | Default information for setting up a connection.
+--
+-- Defaults are as follows:
+--
+-- * Server on @localhost@
+--
+-- * Port on @5432@
+--
+-- * User @postgres@
+--
+-- * No password
+--
+-- * Database @postgres@
+--
+-- Use as in the following example:
+--
+-- > connect defaultConnectInfo { connectHost = "db.example.com" }
+
 defaultConnectInfo :: ConnectInfo
 defaultConnectInfo = ConnectInfo {
                        connectHost = "127.0.0.1"
@@ -89,6 +123,10 @@
 connect :: ConnectInfo -> IO Connection
 connect = connectPostgreSQL . postgreSQLConnectionString
 
+-- | Attempt to make a connection based on a libpq connection string.
+--   See <http://www.postgresql.org/docs/9.1/static/libpq-connect.html>
+--   for more information.
+
 connectPostgreSQL :: ByteString -> IO Connection
 connectPostgreSQL connstr = do
     conn <- PQ.connectdb connstr
@@ -104,6 +142,8 @@
                              , sqlErrorMsg    = msg
                              , sqlState       = ""  }
 
+-- | Turns a 'ConnectInfo' data structure into a libpq connection string.
+
 postgreSQLConnectionString :: ConnectInfo -> ByteString
 postgreSQLConnectionString connectInfo = fromString connstr
   where
@@ -116,12 +156,12 @@
 
     str name field
       | null value = id
-      | otherwise  = (name ++) . quote value . space
+      | otherwise  = showString name . quote value . space
         where value = field connectInfo
 
     num name field
       | value <= 0 = id
-      | otherwise  = (name ++) . (show value ++) . space
+      | otherwise  = showString name . shows value . space
         where value = field connectInfo
 
     quote str rest = '\'' : foldr delta ('\'' : rest) str
@@ -177,5 +217,11 @@
         `finally` do
             putMVar connectionHandle =<< PQ.newNullConnection
         )
+
+newNullConnection :: IO Connection
+newNullConnection = do
+    connectionHandle  <- newMVar =<< PQ.newNullConnection
+    connectionObjects <- newMVar IntMap.empty
+    return Connection{..}
 
 data RawResult = RawResult { rawField :: Field, rawData :: Maybe ByteString }
diff --git a/src/Database/PostgreSQL/Simple/Result.hs b/src/Database/PostgreSQL/Simple/Result.hs
--- a/src/Database/PostgreSQL/Simple/Result.hs
+++ b/src/Database/PostgreSQL/Simple/Result.hs
@@ -177,11 +177,18 @@
     convert f dat = ST.unpack <$> convert f dat
 
 instance Result UTCTime where
-    convert f = doConvert f ok $ \bs ->
-        case parseTime defaultTimeLocale "%F %T%Q%z" (B8.unpack bs ++ "00") of
-          Just t -> Right t
-          Nothing -> returnError ConversionFailed f "could not parse"
-      where ok = mkCompats [TimestampWithTimeZone]
+    convert f =
+        case oid2builtin (typeOid f) of
+          Just Timestamp             -> doIt "%F %T%Q"   id
+          Just TimestampWithTimeZone -> doIt "%F %T%Q%z" (++ "00")
+          _ -> const $ returnError Incompatible f "types incompatible"
+        where
+          doIt _   _          Nothing   = returnError UnexpectedNull f ""
+          doIt fmt preprocess (Just bs) =
+              case parseTime defaultTimeLocale fmt str of
+                Just t  -> Right t
+                Nothing -> returnError ConversionFailed f "could not parse"
+              where str = preprocess (B8.unpack bs)
 
 instance Result Day where
     convert f = atto ok date f
