diff --git a/bench/Main.hs b/bench/Main.hs
new file mode 100644
--- /dev/null
+++ b/bench/Main.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Main where
+
+import Data.Time
+
+import Criterion.Main as Criterion
+
+import Data.GenValidity.Criterion
+import Data.GenValidity.Time ()
+
+main :: IO ()
+main =
+  Criterion.defaultMain
+    [ genValidBench @Day
+    , genValidBench @UniversalTime
+    , genValidBench @DiffTime
+    , genValidBench @UTCTime
+    , genValidBench @NominalDiffTime
+    -- , genValidBench @TimeLocale -- No NFData instance
+    , genValidBench @TimeZone
+    , genValidBench @TimeOfDay
+    , genValidBench @LocalTime
+    , genValidBench @ZonedTime
+    ]
diff --git a/genvalidity-time.cabal b/genvalidity-time.cabal
--- a/genvalidity-time.cabal
+++ b/genvalidity-time.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 8825c813c87f8d5631c4ffba6dee7400ac940078993ed71f67f0c86aa14a9ba7
+-- hash: d555d09c0ebb33d8de9eea283249aaf0bcb427c0af14d4c8e6b5051ebc0e85f0
 
 name:           genvalidity-time
-version:        0.2.1.2
+version:        0.3.0.0
 synopsis:       GenValidity support for time
 description:    Please see README.md
 category:       Testing
@@ -57,5 +57,21 @@
     , genvalidity-hspec
     , genvalidity-time
     , hspec
+    , time
+  default-language: Haskell2010
+
+benchmark genvalidity-time-bench
+  type: exitcode-stdio-1.0
+  main-is: Main.hs
+  other-modules:
+      Paths_genvalidity_time
+  hs-source-dirs:
+      bench
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+  build-depends:
+      base >=4.7 && <5
+    , criterion
+    , genvalidity-criterion
+    , genvalidity-time
     , time
   default-language: Haskell2010
diff --git a/src/Data/GenValidity/Time/Clock.hs b/src/Data/GenValidity/Time/Clock.hs
--- a/src/Data/GenValidity/Time/Clock.hs
+++ b/src/Data/GenValidity/Time/Clock.hs
@@ -14,41 +14,46 @@
 import Test.QuickCheck
 
 instance GenUnchecked UniversalTime where
-    genUnchecked = ModJulianDate <$> genUnchecked
-    shrinkUnchecked = fmap ModJulianDate . shrinkUnchecked . getModJulianDate
+  genUnchecked = ModJulianDate <$> genUnchecked
+  shrinkUnchecked = fmap ModJulianDate . shrinkUnchecked . getModJulianDate
 
 instance GenValid UniversalTime where
-    genValid = ModJulianDate <$> genValid
+  genValid = ModJulianDate <$> genValid
 
 instance GenUnchecked DiffTime where
-    genUnchecked = picosecondsToDiffTime <$> genUnchecked
+  genUnchecked = picosecondsToDiffTime <$> genUnchecked
 #if MIN_VERSION_time(1,6,0)
-    shrinkUnchecked =
-        fmap picosecondsToDiffTime . shrinkUnchecked . diffTimeToPicoseconds
+  shrinkUnchecked =
+    fmap picosecondsToDiffTime . shrinkUnchecked . diffTimeToPicoseconds
 #else
-    shrinkUnchecked = const []
+  shrinkUnchecked = const []
 #endif
 instance GenValid DiffTime where
-    genValid = picosecondsToDiffTime <$> genValid
+  genValid = picosecondsToDiffTime <$> genValid
 
 instance GenUnchecked UTCTime where
-    genUnchecked = UTCTime <$> genUnchecked <*> genUnchecked
-    shrinkUnchecked (UTCTime d dt) =
-        [UTCTime d' dt' | (d', dt') <- shrinkUnchecked (d, dt)]
+  genUnchecked = UTCTime <$> genUnchecked <*> genUnchecked
+  shrinkUnchecked (UTCTime d dt) =
+    [UTCTime d' dt' | (d', dt') <- shrinkUnchecked (d, dt)]
 
 instance GenValid UTCTime where
-    genValid =
-        UTCTime <$> genValid <*>
-        (genValid `suchThat` (>= 0) `suchThat` (<= 86400))
+  genValid =
+    UTCTime <$> genValid <*> (fromIntegral <$> choose (0 :: Int, 86400))
 
 instance GenInvalid UTCTime
-
+#if MIN_VERSION_time(1,9,1)
 instance GenUnchecked NominalDiffTime where
-    genUnchecked = diffUTCTime <$> genUnchecked <*> genUnchecked
+  genUnchecked = secondsToNominalDiffTime <$> genUnchecked
+#else
+instance GenUnchecked NominalDiffTime where
+  genUnchecked = diffUTCTime <$> genUnchecked <*> genUnchecked
+#endif
 #if MIN_VERSION_time(1,9,0)
-    shrinkUnchecked =
-        fmap secondsToNominalDiffTime . shrinkUnchecked . nominalDiffTimeToSeconds
+  shrinkUnchecked =
+    fmap secondsToNominalDiffTime . shrinkUnchecked . nominalDiffTimeToSeconds
 #else
-    shrinkUnchecked = const []
+  shrinkUnchecked = const []
 #endif
-instance GenValid NominalDiffTime
+instance GenValid NominalDiffTime where
+  genValid = genUnchecked
+  shrinkValid = shrinkUnchecked
diff --git a/src/Data/GenValidity/Time/LocalTime.hs b/src/Data/GenValidity/Time/LocalTime.hs
--- a/src/Data/GenValidity/Time/LocalTime.hs
+++ b/src/Data/GenValidity/Time/LocalTime.hs
@@ -6,50 +6,65 @@
 import Control.Applicative ((<*>))
 import Data.Functor ((<$>))
 #endif
+import Data.Fixed
 import Data.GenValidity
 import Data.GenValidity.Time.Calendar ()
+import Data.Time.Format
 import Data.Time.LocalTime
 import Data.Validity.Time.LocalTime ()
 
 import Test.QuickCheck
 
 instance GenUnchecked TimeZone where
-    genUnchecked = TimeZone <$> genUnchecked <*> genUnchecked <*> genUnchecked
-    shrinkUnchecked (TimeZone m so n) =
-        [TimeZone m' so' n' | (m', so', n') <- shrinkUnchecked (m, so, n)]
+  genUnchecked = TimeZone <$> genUnchecked <*> genUnchecked <*> genUnchecked
+  shrinkUnchecked (TimeZone m so n) =
+    [TimeZone m' so' n' | (m', so', n') <- shrinkUnchecked (m, so, n)]
 
 instance GenValid TimeZone where
-    genValid = TimeZone <$> genValid <*> genValid <*> genValid
+  genValid = TimeZone <$> genValid <*> genValid <*> genTimeZoneName
 
+genTimeZoneName :: Gen String
+genTimeZoneName =
+  frequency
+    [ (1, pure "")
+    , ( 4 -- Any three characters
+      , (:) <$> genValid <*>
+        ((:) <$> genValid <*> ((:) <$> genValid <*> pure [])))
+    , ( 4 -- A +HHMM string
+      , (:) <$> elements ['-', '+'] <*>
+        (formatTime defaultTimeLocale "%H%M" <$>
+         (TimeOfDay <$> choose (0, 23) <*> choose (0, 59) <*> pure 0)))
+    , (1, genValid)
+    ]
+
 instance GenUnchecked TimeOfDay where
-    genUnchecked = TimeOfDay <$> genUnchecked <*> genUnchecked <*> genUnchecked
-    shrinkUnchecked (TimeOfDay h m s) =
-        [TimeOfDay h' m' s' | (h', m', s') <- shrinkUnchecked (h, m, s)]
+  genUnchecked = TimeOfDay <$> genUnchecked <*> genUnchecked <*> genUnchecked
+  shrinkUnchecked (TimeOfDay h m s) =
+    [TimeOfDay h' m' s' | (h', m', s') <- shrinkUnchecked (h, m, s)]
 
 instance GenValid TimeOfDay where
-    genValid =
-        TimeOfDay <$> (genValid `suchThat` (>= 0) `suchThat` (<= 23)) <*>
-        (genValid `suchThat` (>= 0) `suchThat` (<= 59)) <*>
-        (genValid `suchThat` (>= 0) `suchThat` (<= 60))
+  genValid =
+    TimeOfDay <$> (choose (0, 23)) <*> (choose (0, 59)) <*>
+    (MkFixed <$> choose (0, 60999999999999))
 
 instance GenInvalid TimeOfDay
 
 instance GenUnchecked LocalTime where
-    genUnchecked = LocalTime <$> genUnchecked <*> genUnchecked
-    shrinkUnchecked (LocalTime d tod) =
-        [LocalTime d' tod' | (d', tod') <- shrinkUnchecked (d, tod)]
+  genUnchecked = LocalTime <$> genUnchecked <*> genUnchecked
+  shrinkUnchecked (LocalTime d tod) =
+    [LocalTime d' tod' | (d', tod') <- shrinkUnchecked (d, tod)]
 
 instance GenValid LocalTime where
-    genValid = LocalTime <$> genValid <*> genValid
+  genValid = LocalTime <$> genValid <*> genValid
 
 instance GenInvalid LocalTime
 
 instance GenUnchecked ZonedTime where
-    genUnchecked = ZonedTime <$> genUnchecked <*> genUnchecked
-    shrinkUnchecked (ZonedTime lt tz) =
-        [ZonedTime lt' tz' | (lt', tz') <- shrinkUnchecked (lt, tz)]
+  genUnchecked = ZonedTime <$> genUnchecked <*> genUnchecked
+  shrinkUnchecked (ZonedTime lt tz) =
+    [ZonedTime lt' tz' | (lt', tz') <- shrinkUnchecked (lt, tz)]
 
 instance GenValid ZonedTime where
-    genValid = ZonedTime <$> genValid <*> genValid
+  genValid = ZonedTime <$> genValid <*> genValid
 
 instance GenInvalid ZonedTime
