diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,20 @@
+# Changelog
+
+#### 2.4.0.4
+
+* Zero-prefix years when parsing dates.
+
+#### 2.4.0.3
+
+* Compatibility with GHC 8.8/time 1.9
+
+#### 2.4.0.2
+
+* Compatibility with GHC 8.2/time 1.8
+
+#### 2.4.0.1
+
+* Compatibility with time 1.5.
+* Minor documentation fixes.
+
+
diff --git a/Database/HDBC.hs b/Database/HDBC.hs
--- a/Database/HDBC.hs
+++ b/Database/HDBC.hs
@@ -128,28 +128,22 @@
  * Support for querying database server properties
 
  * Add-on package (hdbc-missingh) to integrate with MissingH,
-   providing a database backend for AnyDBM.
+   providing a database backend for AnyDBM
 
- * Support for querying metadata such as column names.
+ * Support for querying metadata such as column names
 
  * Support for querying additional metadata (column types, etc.)
 -}
 
 {- $drivers
 
-Here is a list of known drivers as of January 26, 2009:
+Here is a list of known drivers as of May 6, 2019:
 
-[@Sqlite v3@] Available from <http://software.complete.org/hdbc-sqlite3>.  Or, to
-participate in development, use 
-@git clone <git://git.complete.org/hdbc-sqlite3>@
+[@Sqlite v3@] Available from <https://github.com/hdbc/hdbc-sqlite3>.
 
-[@PostgreSQL@] Available from <http://software.complete.org/hdbc-postgresql>.  Or, to
-participate in development, use
-@git clone <git://git.complete.org/hdbc-postgresql>@
+[@PostgreSQL@] Available from <https://github.com/hdbc/hdbc-postgresql>.
 
-[@ODBC@] Available from <http://software.complete.org/hdbc-odbc>.  Or, to
-partitipace in development, use
-@git clone <git://git.complete.org/hdbc-odbc>@
+[@ODBC@] Available from <https://github.com/hdbc/hdbc-odbc>.
 
 [@MySQL@] MySQL users have two choices: the first is the ODBC driver, which works
 and has been tested against MySQL on both Linux\/Unix and Windows platforms.  There is
@@ -157,16 +151,8 @@
 <http://hackage.haskell.org/cgi-bin/hackage-scripts/package/HDBC-mysql> with a homepage
 at <http://www.maubi.net/~waterson/hacks/hdbc-mysql.html>.
 
-In addition, there is one integration package: /hdbc-anydbm/.  This
-integrates with the AnyDBM library <http://software.complete.org/anydbm>.
-It lets any HDBC database act as a backend for the
-AnyDBM interface.  Available from <http://software.complete.org/hdbc-anydbm>.  Or,
-to participate in development, use
-@darcs get --partial <http://darcs.complete.org/hdbc-anydbm>@
-
 The latest version of HDBC itself is available from
-<http://software.complete.org/hdbc>.  Or, to participate in development, use
-@git clone <git://git.complete.org/hdbc>@.
+<https://github.com/hdbc/hdbc>.
 -}
 
 {- $transactions
diff --git a/Database/HDBC/ColTypes.hs b/Database/HDBC/ColTypes.hs
--- a/Database/HDBC/ColTypes.hs
+++ b/Database/HDBC/ColTypes.hs
@@ -12,6 +12,7 @@
 
 Written by John Goerzen, jgoerzen\@complete.org
 -}
+{-# LANGUAGE DeriveDataTypeable #-}
 
 module Database.HDBC.ColTypes (SqlColDesc(..),
                                SqlTypeId(..),
@@ -42,13 +43,7 @@
               ,colDecDigits :: Maybe Int -- ^ Digits to the right of the period
               ,colNullable :: Maybe Bool -- ^ Whether NULL is acceptable
               }
-   deriving (Eq, Read, Show)
-
-sqlColDescTc :: TyCon
-sqlColDescTc = mkTyCon "Database.HDBC.SqlColDesc"
-
-instance Typeable SqlColDesc where
-    typeOf _ = mkTyConApp sqlColDescTc []
+   deriving (Eq, Read, Show, Typeable)
 
 {- | The type identifier for a given column. 
 
@@ -88,13 +83,7 @@
     | SqlGUIDT                  -- ^ Global unique identifier
     | SqlUnknownT String        -- ^ A type not represented here; implementation-specific information in the String
 
-  deriving (Eq, Show, Read)
-
-sqlTypeIdTc :: TyCon
-sqlTypeIdTc = mkTyCon "Database.HDBC.SqlTypeId"
-
-instance Typeable SqlTypeId where
-    typeOf _ = mkTyConApp sqlTypeIdTc []
+  deriving (Eq, Show, Read, Typeable)
 
 {- | The different types of intervals in SQL. -}
 data SqlInterval =
@@ -111,10 +100,4 @@
     | SqlIntervalHourToMinuteT  -- ^ Difference in hours+minutes
     | SqlIntervalHourToSecondT  -- ^ Difference in hours+seconds
     | SqlIntervalMinuteToSecondT -- ^ Difference in minutes+seconds
-      deriving (Eq, Show, Read)
-
-sqlIntervalTc :: TyCon
-sqlIntervalTc = mkTyCon "Database.HDBC.SqlInterval"
-
-instance Typeable SqlInterval where
-    typeOf _ = mkTyConApp sqlIntervalTc []
+      deriving (Eq, Show, Read, Typeable)
diff --git a/Database/HDBC/Locale.hs b/Database/HDBC/Locale.hs
--- a/Database/HDBC/Locale.hs
+++ b/Database/HDBC/Locale.hs
@@ -1,17 +1,34 @@
+{-# LANGUAGE CPP #-}
 module Database.HDBC.Locale
     (
      defaultTimeLocale,
-     iso8601DateFormat
+     iso8601DateFormat,
+     oldIso8601DateFormat
     )
 
 where
+
+#ifdef MIN_TIME_15
+import Data.Time.Format (defaultTimeLocale)
+#else
 import System.Locale (defaultTimeLocale)
+#endif
 
 -- | As the semantic of System.Locale.iso8601DateFormat has changed with
 --   old-locale-1.0.0.2 in a non-compatible way, we now define our own
 --   (compatible) version of it.
 iso8601DateFormat :: Maybe String -> String
 iso8601DateFormat mTimeFmt =
+    "%0Y-%m-%d" ++ case mTimeFmt of
+             Nothing  -> ""
+             Just fmt -> ' ' : fmt
+
+-- | HDBC would in versions up to and including 2.4.0.3 use this time format
+-- string to serialize timestamps. To keep being able to deserialize timestamps
+-- serialized on database engines that keep the representation intact (e.g.
+-- SQLite) we keep this format string around, such that we can fall back to it.
+oldIso8601DateFormat :: Maybe String -> String
+oldIso8601DateFormat mTimeFmt =
     "%Y-%m-%d" ++ case mTimeFmt of
              Nothing  -> ""
              Just fmt -> ' ' : fmt
diff --git a/Database/HDBC/SqlValue.hs b/Database/HDBC/SqlValue.hs
--- a/Database/HDBC/SqlValue.hs
+++ b/Database/HDBC/SqlValue.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE StandaloneDeriving #-}
 module Database.HDBC.SqlValue
     (
      -- * SQL value marshalling
@@ -7,6 +9,7 @@
     )
 
 where
+import Control.Applicative ((<|>))
 import Data.Dynamic
 import qualified Data.ByteString.UTF8 as BUTF8
 import qualified Data.ByteString as B
@@ -15,9 +18,18 @@
 import Data.Word
 import Data.Int
 import qualified System.Time as ST
-import Data.Time
+import Data.Time ( Day (ModifiedJulianDay), DiffTime, LocalTime, NominalDiffTime, ParseTime
+                 , TimeOfDay, TimeZone, UTCTime, ZonedTime, formatTime, localDay, localTimeOfDay
+                 , timeOfDayToTime, timeToTimeOfDay, toModifiedJulianDay, utc
+                 , utcToZonedTime, zonedTimeToLocalTime, zonedTimeToUTC, zonedTimeZone
+#if MIN_TIME_15
+                 , parseTimeM
+#else
+                 , parseTime
+#endif
+                 )
 import Data.Time.Clock.POSIX
-import Database.HDBC.Locale (defaultTimeLocale, iso8601DateFormat)
+import Database.HDBC.Locale (defaultTimeLocale, iso8601DateFormat, oldIso8601DateFormat)
 import Data.Ratio
 import Data.Convertible
 import Data.Fixed
@@ -59,7 +71,7 @@
 posixToSql :: POSIXTime -> SqlValue
 posixToSql x = SqlPOSIXTime x
 
-{- | 'SqlValue' is he main type for expressing Haskell values to SQL databases.
+{- | 'SqlValue' is the main type for expressing Haskell values to SQL databases.
 
 /INTRODUCTION TO SQLVALUE/
 
@@ -167,7 +179,7 @@
  * Both represent the same type and the encapsulated values are considered equal
    by applying (==) to them
 
- * The values of each, when converted to a string, are equal.
+ * The values of each, when converted to a string, are equal
 
 /STRING VERSIONS OF TIMES/
 
@@ -198,21 +210,18 @@
               | SqlBool Bool
               | SqlDouble Double
               | SqlRational Rational
-              | SqlLocalDate Day            -- ^ Local YYYY-MM-DD (no timezone)
-              | SqlLocalTimeOfDay TimeOfDay -- ^ Local HH:MM:SS (no timezone)
+              | SqlLocalDate Day            -- ^ Local YYYY-MM-DD (no timezone).
+              | SqlLocalTimeOfDay TimeOfDay -- ^ Local HH:MM:SS (no timezone).
               | SqlZonedLocalTimeOfDay TimeOfDay TimeZone -- ^ Local HH:MM:SS -HHMM.  Converts to and from (TimeOfDay, TimeZone).
-              | SqlLocalTime LocalTime      -- ^ Local YYYY-MM-DD HH:MM:SS (no timezone)
+              | SqlLocalTime LocalTime      -- ^ Local YYYY-MM-DD HH:MM:SS (no timezone).
               | SqlZonedTime ZonedTime      -- ^ Local YYYY-MM-DD HH:MM:SS -HHMM.  Considered equal if both convert to the same UTC time.
-              | SqlUTCTime UTCTime          -- ^ UTC YYYY-MM-DD HH:MM:SS
+              | SqlUTCTime UTCTime          -- ^ UTC YYYY-MM-DD HH:MM:SS.
               | SqlDiffTime NominalDiffTime -- ^ Calendar diff between seconds.  Rendered as Integer when converted to String, but greater precision may be preserved for other types or to underlying database.
               | SqlPOSIXTime POSIXTime      -- ^ Time as seconds since midnight Jan 1 1970 UTC.  Integer rendering as for 'SqlDiffTime'.
               | SqlEpochTime Integer      -- ^ DEPRECATED Representation of ClockTime or CalendarTime.  Use SqlPOSIXTime instead.
               | SqlTimeDiff Integer -- ^ DEPRECATED Representation of TimeDiff.  Use SqlDiffTime instead.
-              | SqlNull         -- ^ NULL in SQL or Nothing in Haskell
-     deriving (Show)
-
-instance Typeable SqlValue where
-    typeOf _ = mkTypeName "SqlValue"
+              | SqlNull         -- ^ NULL in SQL or Nothing in Haskell.
+     deriving (Show, Typeable)
 
 instance Eq SqlValue where
     SqlString a == SqlString b = a == b
@@ -242,6 +251,9 @@
     a == b = ((safeFromSql a)::ConvertResult String) == 
              ((safeFromSql b)::ConvertResult String)
 
+deriving instance Typeable ST.ClockTime
+deriving instance Typeable ST.TimeDiff
+
 instance Convertible SqlValue SqlValue where
     safeConvert = return
 
@@ -595,30 +607,10 @@
     safeConvert (SqlTimeDiff x) = return . fromIntegral $ x
     safeConvert y@(SqlNull) = quickError y
 
-#ifndef TIME_GT_113
-instance Typeable Day where
-    typeOf _ = mkTypeName "Day"
-instance Typeable TimeOfDay where
-    typeOf _ = mkTypeName "TimeOfDay"
-instance Typeable LocalTime where
-    typeOf _ = mkTypeName "LocalTime"
-instance Typeable ZonedTime where
-    typeOf _ = mkTypeName "ZonedTime"
-instance Typeable DiffTime where
-    typeOf _ = mkTypeName "DiffTime"
-instance Typeable TimeZone where
-    typeOf _ = mkTypeName "TimeZone"
-#endif
-
-instance Typeable ST.ClockTime where
-    typeOf _ = mkTypeName "ClockTime"
-instance Typeable ST.TimeDiff where
-    typeOf _ = mkTypeName "TimeDiff"
-
 instance Convertible Day SqlValue where
     safeConvert = return . SqlLocalDate
 instance Convertible SqlValue Day where
-    safeConvert (SqlString x) = parseTime' (iso8601DateFormat Nothing) x
+    safeConvert (SqlString x) = parseTimeISO8601 Nothing x
     safeConvert (SqlByteString x) = safeConvert (SqlString (BUTF8.toString x))
     safeConvert (SqlInt32 x) = 
         return $ ModifiedJulianDay {toModifiedJulianDay = fromIntegral x}
@@ -679,7 +671,11 @@
 instance Convertible SqlValue (TimeOfDay, TimeZone) where
     safeConvert (SqlString x) = 
         do tod <- parseTime' "%T%Q %z" x
+#if MIN_TIME_15
+           tz <- case parseTimeM True defaultTimeLocale "%T%Q %z" x of
+#else
            tz <- case parseTime defaultTimeLocale "%T%Q %z" x of
+#endif
                       Nothing -> convError "Couldn't extract timezone in" (SqlString x)
                       Just y -> Right y
            return (tod, tz)
@@ -709,7 +705,7 @@
 instance Convertible LocalTime SqlValue where
     safeConvert = return . SqlLocalTime
 instance Convertible SqlValue LocalTime where
-    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T%Q")) x
+    safeConvert (SqlString x) = parseTimeISO8601 (Just "%T%Q") x
     safeConvert (SqlByteString x) = safeConvert (SqlString (BUTF8.toString x))
     safeConvert y@(SqlInt32 _) = quickError y
     safeConvert y@(SqlInt64 _) = quickError y
@@ -735,7 +731,7 @@
 instance Convertible ZonedTime SqlValue where
     safeConvert = return . SqlZonedTime
 instance Convertible SqlValue ZonedTime where
-    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T%Q %z")) x
+    safeConvert (SqlString x) = parseTimeISO8601 (Just "%T%Q %z") x
     safeConvert (SqlByteString x) = safeConvert (SqlString (BUTF8.toString x))
     safeConvert (SqlInt32 x) = safeConvert (SqlInteger (fromIntegral x))
     safeConvert (SqlInt64 x) = safeConvert (SqlInteger (fromIntegral x))
@@ -761,7 +757,7 @@
 instance Convertible UTCTime SqlValue where
     safeConvert = return . SqlUTCTime
 instance Convertible SqlValue UTCTime where
-    safeConvert (SqlString x) = parseTime' (iso8601DateFormat (Just "%T%Q")) x
+    safeConvert (SqlString x) = parseTimeISO8601 (Just "%T%Q") x
     safeConvert (SqlByteString x) = safeConvert (SqlString (BUTF8.toString x))
     safeConvert y@(SqlInt32 _) = safeConvert y >>= return . posixSecondsToUTCTime
     safeConvert y@(SqlInt64 _) = safeConvert y >>= return . posixSecondsToUTCTime
@@ -953,8 +949,25 @@
 #else
 parseTime' :: (Typeable t, Convertible SqlValue t, ParseTime t) => String -> String -> ConvertResult t
 parseTime' fmtstr inpstr = 
+#if MIN_TIME_15
+    case parseTimeM True defaultTimeLocale fmtstr inpstr of
+#else
     case parseTime defaultTimeLocale fmtstr inpstr of
+#endif
       Nothing -> convError ("Cannot parse using default format string " ++ show fmtstr)
                  (SqlString inpstr)
       Just x -> Right x
+#endif
+
+parseTimeISO8601 :: (Typeable t, Convertible SqlValue t, ParseTime t) => Maybe String -> String -> ConvertResult t
+parseTimeISO8601 fmtstr inpstr =
+  case tryParse iso8601DateFormat <|> tryParse oldIso8601DateFormat of
+    Nothing -> convError "Cannot parse ISO8601 timestamp" (SqlString inpstr)
+    Just x -> Right x
+  where
+  tryParse fmtFunction =
+#if MIN_TIME_15
+    parseTimeM True defaultTimeLocale (fmtFunction fmtstr) inpstr
+#else
+    parseTime defaultTimeLocale (fmtFunction fmtstr) inpstr
 #endif
diff --git a/Database/HDBC/Statement.hs b/Database/HDBC/Statement.hs
--- a/Database/HDBC/Statement.hs
+++ b/Database/HDBC/Statement.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveDataTypeable #-}
 module Database.HDBC.Statement
     (
     Statement(..),
@@ -107,13 +108,8 @@
 data SqlError = SqlError {seState :: String,
                           seNativeError :: Int,
                           seErrorMsg :: String}
-                deriving (Eq, Show, Read)
-
-sqlErrorTc :: TyCon
-sqlErrorTc = mkTyCon "Database.HDBC.SqlError"
+                deriving (Eq, Show, Read, Typeable)
 
-instance Typeable SqlError where
-    typeOf _ = mkTyConApp sqlErrorTc []
 
 #if __GLASGOW_HASKELL__ >= 610
 --data SqlException
diff --git a/Database/HDBC/Utils.hs b/Database/HDBC/Utils.hs
--- a/Database/HDBC/Utils.hs
+++ b/Database/HDBC/Utils.hs
@@ -215,7 +215,7 @@
         Just r -> do names <- getColumnNames sth
                      return $ Just $ zip names r
 
-{- | Strict version of 'fetchRowAL' -}
+{- | Strict version of 'fetchRowAL'. -}
 fetchRowAL' :: Statement -> IO (Maybe [(String, SqlValue)])
 fetchRowAL' sth =
     do res <- fetchRowAL sth
@@ -233,7 +233,7 @@
               Nothing -> return Nothing
               Just x -> return $ Just $ Map.fromList x
 
-{- | Strict version of 'fetchRowMap' -}
+{- | Strict version of 'fetchRowMap'. -}
 fetchRowMap' :: Statement -> IO (Maybe (Map.Map String SqlValue))
 fetchRowMap' sth = 
     do res <- fetchRowMap sth
@@ -272,7 +272,7 @@
        return res
 
 {- | A quick way to do a query.  Similar to preparing, executing, and
-then calling 'fetchAllRows' on a statement. See also 'quickQuery'' -}
+then calling 'fetchAllRows' on a statement. See also 'quickQuery''. -}
 quickQuery :: IConnection conn => conn -> String -> [SqlValue] -> IO [[SqlValue]]
 quickQuery conn qrystr args =
     do sth <- prepare conn qrystr
diff --git a/HDBC.cabal b/HDBC.cabal
--- a/HDBC.cabal
+++ b/HDBC.cabal
@@ -1,12 +1,12 @@
 Name: HDBC
-Version: 2.3.1.2
+Version: 2.4.0.5
 License: BSD3
-Maintainer: Nicolas Wu <nicolas.wu@gmail.com>
-Author: John Goerzen
+Maintainer: Nicolas Wu <nicolas.wu@gmail.com>, David Johnson <code@dmj.io>
+Author: John Goerzen, Nicolas Wu
 homepage: https://github.com/hdbc/hdbc
 Copyright: Copyright (c) 2005-2011 John Goerzen
 license-file: LICENSE
-extra-source-files: LICENSE, Makefile, README.md
+extra-source-files: LICENSE, Makefile, README.md, CHANGELOG.md
 Category: Database
 synopsis: Haskell Database Connectivity
 Description: HDBC provides an abstraction layer between Haskell programs and SQL
@@ -16,7 +16,7 @@
 Stability: Stable
 Build-Type: Simple
 
-Cabal-Version: >=1.8
+Cabal-Version: >=1.10
 
 source-repository head
   type:            git
@@ -27,21 +27,21 @@
 flag buildtests
   description: Build the executable to run unit tests
   default: False
-
-flag time_gte_113
-  description: time > 1.1.3 has defined some more instances so omit them here
+flag minTime15
+  description: Use time 1.5 or higher.
+  default: True
 
 library
   if flag(splitBase)
-    Build-Depends: base>=3 && <5, old-time, time>=1.1.2.4 && <=1.5, bytestring, containers, old-locale
-    if flag(time_gte_113)
-      Build-Depends: time>=1.1.3
-      CPP-OPTIONS: -DTIME_GT_113
+    Build-Depends: base>=3 && <5, old-time, bytestring, containers
+    if flag(minTime15)
+      Build-Depends: time >= 1.5 && < 1.17
+      CPP-Options: -DMIN_TIME_15
     else
-      Build-Depends: time<1.1.3
+      Build-Depends: time >= 1.2 && < 1.5, old-locale
   else
     Build-Depends: base<3
-  Build-Depends: mtl, convertible >= 1.0.10.0, text, utf8-string
+  Build-Depends: mtl, convertible >= 1.1.0.0, text, utf8-string
 
   -- Hack for cabal-install weirdness.  cabal-install forces base 3,
   -- though it works fine for Setup.lhs manually.  Fix.
@@ -54,25 +54,26 @@
     Database.HDBC.ColTypes, Database.HDBC.Statement, Database.HDBC.SqlValue,
     Database.HDBC.Locale
   Other-Modules: Database.HDBC.Utils
-  Extensions: ExistentialQuantification, CPP, MultiParamTypeClasses,
+  Default-Extensions: ExistentialQuantification, CPP, MultiParamTypeClasses,
     FlexibleContexts, TypeSynonymInstances, TypeOperators, RankNTypes,
-    FlexibleInstances
-    
+    FlexibleInstances, DeriveDataTypeable
+  Default-Language: Haskell2010
+
 Executable runtests
    if flag(buildtests)
       Buildable: True
-      Build-Depends: HUnit, QuickCheck (>= 2.0), testpack (>= 2.0)
+      Build-Depends: HUnit, QuickCheck >= 2.0
 
       if flag(splitBase)
-        Build-Depends: base>=3 && <5, old-time, time>=1.1.2.4 && <=1.5, bytestring, containers, old-locale
-        if flag(time_gte_113)
-          Build-Depends: time>=1.1.3
-          CPP-OPTIONS: -DTIME_GT_113
+        Build-Depends: base>=3 && <5, old-time, bytestring, containers
+        if flag(minTime15)
+          Build-Depends: time >= 1.5 && < 1.17
+          CPP-Options: -DMIN_TIME_15
         else
-          Build-Depends: time<1.1.3
+          Build-Depends: time >= 1.2 && < 1.5, old-locale
       else
         Build-Depends: base<3
-      Build-Depends: mtl, convertible >= 1.0.9.1, utf8-string, text
+      Build-Depends: mtl, convertible >= 1.1.0.0, utf8-string, text
 
       -- Hack for cabal-install weirdness.  cabal-install forces base 3,
       -- though it works fine for Setup.lhs manually.  Fix.
@@ -82,10 +83,9 @@
       Buildable: False
    Main-Is: runtests.hs
    Other-Modules: TestSqlValue
-                  TestInfrastructure
    Hs-Source-Dirs: ., testsrc
    GHC-Options: -O2
-   Extensions: ExistentialQuantification, CPP, MultiParamTypeClasses,
+   Default-Extensions: ExistentialQuantification, CPP, MultiParamTypeClasses,
      FlexibleContexts, TypeSynonymInstances, TypeOperators,
      RankNTypes, FlexibleInstances
-   
+   Default-Language: Haskell2010
diff --git a/testsrc/TestInfrastructure.hs b/testsrc/TestInfrastructure.hs
deleted file mode 100644
--- a/testsrc/TestInfrastructure.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-{-
-Copyright (C) 2009 John Goerzen <jgoerzen@complete.org>
-
-All rights reserved.
-
-For license and copyright information, see the file COPYRIGHT
--}
-module TestInfrastructure where
-import qualified Test.QuickCheck as QC
-import qualified Test.HUnit as HU
-import Test.HUnit.Tools
-
-q :: QC.Testable a => String -> a -> HU.Test
-q = qc2hu 250
-
-qverbose :: QC.Testable a => String -> a -> HU.Test
-qverbose = qc2hu 250
diff --git a/testsrc/TestSqlValue.hs b/testsrc/TestSqlValue.hs
--- a/testsrc/TestSqlValue.hs
+++ b/testsrc/TestSqlValue.hs
@@ -7,27 +7,25 @@
 -}
 
 module TestSqlValue where
-import TestInfrastructure
 import Test.QuickCheck hiding (Result)
 import Test.QuickCheck.Property (Result)
-import Test.QuickCheck.Tools
 import qualified Test.HUnit as HU
 import Database.HDBC
-import Data.Time.Format
+import Data.Time.Format (parseTime)
 import Data.Time.LocalTime
-import Database.HDBC.Locale (defaultTimeLocale, iso8601DateFormat)
+import Database.HDBC.Locale (defaultTimeLocale, iso8601DateFormat, oldIso8601DateFormat)
 import Data.Maybe
 
 instance Eq ZonedTime where
     a == b = zonedTimeToUTC a == zonedTimeToUTC b &&
              zonedTimeZone a == zonedTimeZone b
 
-toSql_Int :: Int -> Result
-toSql_Int x = toSql x @?= SqlInt64 (fromIntegral x)
+toSql_Int :: Int -> Property
+toSql_Int x = toSql x === SqlInt64 (fromIntegral x)
 
-fromSql_Int :: Int -> Result
+fromSql_Int :: Int -> Property
 fromSql_Int x = 
-    Right x @=? safeFromSql (SqlInt64 (fromIntegral x))
+    Right x === safeFromSql (SqlInt64 (fromIntegral x))
 
 testZonedTimeStr = "1989-08-01 15:33:01 -0500"
 testZonedTime :: ZonedTime
@@ -39,14 +37,25 @@
 testZonedTimeFrac = fromJust $ parseTime defaultTimeLocale (iso8601DateFormat (Just "%T%Q %z"))
                     testZonedTimeFracStr
 
+testZonedTimeTwoDigitYearStr = "89-08-01 15:33:01 -0500"
+testZonedTimeTwoDigitYear :: ZonedTime
+testZonedTimeTwoDigitYear = fromJust $ parseTime defaultTimeLocale (oldIso8601DateFormat (Just "%T %z"))
+                            testZonedTimeTwoDigitYearStr
+
 ztparsenf =
     (HU.@=?) testZonedTime (fromSql (SqlString testZonedTimeStr))
 ztparsef =
     (HU.@=?) testZonedTimeFrac (fromSql (SqlString testZonedTimeFracStr))
+ztparseTwoDigitYear =
+    (HU.@=?) testZonedTimeTwoDigitYear (fromSql (SqlString testZonedTimeTwoDigitYearStr))
 
 hut msg = HU.TestLabel msg . HU.TestCase
 
-allt = [q "toSql Int" toSql_Int,
-        q "safeFromSql Int" fromSql_Int,
-        hut "non-frac parse" ztparsenf,
-        hut "frac parse" ztparsef]
+allHUnitTests = [hut "non-frac parse" ztparsenf,
+                 hut "frac parse" ztparsef,
+                 hut "old serialization of two digit year without leading zeros" ztparseTwoDigitYear
+                ]
+
+allQuickCheckTests = [toSql_Int,
+                      fromSql_Int
+                     ]
diff --git a/testsrc/runtests.hs b/testsrc/runtests.hs
--- a/testsrc/runtests.hs
+++ b/testsrc/runtests.hs
@@ -1,14 +1,9 @@
 module Main where
 import qualified Test.HUnit as HU
-import Test.HUnit.Tools
+import Test.QuickCheck (quickCheck)
 
 import qualified TestSqlValue
 
-test1 = HU.TestCase ((HU.@=?) "x" "x")
-
-alltests = [HU.TestLabel "test1" test1,
-            tl "TestSqlValue" TestSqlValue.allt
-           ]
-
-main = do runVerboseTests (HU.TestList alltests)
+main = do HU.runTestTT (HU.TestList $ TestSqlValue.allHUnitTests)
+          traverse quickCheck TestSqlValue.allQuickCheckTests
           return ()
