diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+0.3.21
+
+* Use time-compat
+* Add `Function` instances for vector, unordered-containers, scientific, nats
+
 0.3.20
 
 * Support QuickCheck-2.13
diff --git a/quickcheck-instances.cabal b/quickcheck-instances.cabal
--- a/quickcheck-instances.cabal
+++ b/quickcheck-instances.cabal
@@ -1,5 +1,5 @@
 Name:                quickcheck-instances
-Version:             0.3.20
+Version:             0.3.21
 
 Synopsis:            Common quickcheck instances
 Description:         QuickCheck instances.
@@ -18,11 +18,11 @@
 
 License:             BSD3
 License-file:        LICENSE
-Author:              Antoine Latter <aslatter@gmail.com>
+Author:              Antoine Latter <aslatter@gmail.com>, Oleg Grenrus <oleg.grenrus@iki.fi>
 Maintainer:          Oleg Grenrus <oleg.grenrus@iki.fi>
 Homepage:            https://github.com/phadej/qc-instances
 Bug-reports:         https://github.com/phadej/qc-instances/issues
-Copyright:           Copyright Antoine Latter, 2012-2014
+Copyright:           Copyright 2012-2016 Antoine Latter, 2017-2019 Oleg Grenrus
 Category:            Testing
 Build-type:          Simple
 Extra-source-files:  CHANGES
@@ -35,7 +35,8 @@
   GHC==8.0.2,
   GHC==8.2.2,
   GHC==8.4.4,
-  GHC==8.6.4
+  GHC==8.6.5,
+  GHC==8.8.1
 
 Source-repository head
   type:     git
@@ -75,21 +76,24 @@
     bytestring           >=0.9.2.1 && <0.11,
     case-insensitive     >=1.2.0.4 && <1.3,
     containers           >=0.4.2.1 && <0.7,
-    hashable             >=1.2.5.0 && <1.3,
+    hashable             >=1.2.5.0 && <1.4,
     old-time             >=1.1.0.0 && <1.2,
     scientific           >=0.2.0.0 && <0.4,
     tagged               >=0.8.5   && <0.9,
     text                 >=1.0.0.0 && <1.3,
-    time                 >=1.4     && <1.9,
+    time-compat          >=1.9.2.2 && <1.10,
     transformers         >=0.3.0.0 && <0.6,
     transformers-compat  >=0.5     && <0.7,
     unordered-containers >=0.2.2.0 && <0.3,
     uuid-types           >=1.0.3   && <1.1,
     vector               >=0.9     && <0.13
 
+  -- version is irrelevant.
+  Build-depends: time
+
   if !impl(ghc >= 8.0)
     build-depends:
-      semigroups >=0.18 && <0.19
+      semigroups >=0.18.5 && <0.20
 
   if !impl(ghc >= 7.10)
     build-depends:
diff --git a/src/Test/QuickCheck/Instances/Natural.hs b/src/Test/QuickCheck/Instances/Natural.hs
--- a/src/Test/QuickCheck/Instances/Natural.hs
+++ b/src/Test/QuickCheck/Instances/Natural.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP              #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 module Test.QuickCheck.Instances.Natural () where
@@ -8,7 +8,9 @@
 import Numeric.Natural (Natural)
 
 import Test.QuickCheck
-import Test.QuickCheck.Function (functionIntegral)
+       (Arbitrary (..), CoArbitrary (..), arbitrarySizedNatural,
+       coarbitraryIntegral, shrinkIntegral)
+import Test.QuickCheck.Function (Function (..), functionIntegral)
 
 -------------------------------------------------------------------------------
 -- nats
diff --git a/src/Test/QuickCheck/Instances/Scientific.hs b/src/Test/QuickCheck/Instances/Scientific.hs
--- a/src/Test/QuickCheck/Instances/Scientific.hs
+++ b/src/Test/QuickCheck/Instances/Scientific.hs
@@ -24,3 +24,8 @@
 
 instance CoArbitrary Scientific.Scientific where
     coarbitrary s = coarbitrary (Scientific.coefficient s, Scientific.base10Exponent s)
+
+instance Function Scientific.Scientific where
+    function = functionMap
+        (\s -> (Scientific.coefficient s, Scientific.base10Exponent s))
+        (uncurry Scientific.scientific)
diff --git a/src/Test/QuickCheck/Instances/Time.hs b/src/Test/QuickCheck/Instances/Time.hs
--- a/src/Test/QuickCheck/Instances/Time.hs
+++ b/src/Test/QuickCheck/Instances/Time.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP              #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 module Test.QuickCheck.Instances.Time () where
@@ -8,8 +8,11 @@
 
 import Test.QuickCheck
 
-import qualified Data.Time as Time
-import qualified Data.Time.Clock.TAI as Time
+import qualified Data.Time.Calendar.Compat     as Time
+import qualified Data.Time.Clock.Compat        as Time
+import qualified Data.Time.Clock.System.Compat as Time
+import qualified Data.Time.Clock.TAI.Compat    as Time
+import qualified Data.Time.LocalTime.Compat    as Time
 
 -------------------------------------------------------------------------------
 -- time
@@ -70,6 +73,9 @@
 instance CoArbitrary Time.NominalDiffTime where
     coarbitrary = coarbitraryReal
 
+instance Function Time.NominalDiffTime where
+    function = functionMap toRational fromRational
+
 instance Arbitrary Time.TimeZone where
     arbitrary =
         Time.TimeZone
@@ -136,3 +142,47 @@
 
 instance CoArbitrary Time.AbsoluteTime where
     coarbitrary = coarbitrary . flip Time.diffAbsoluteTime Time.taiEpoch
+
+instance Arbitrary Time.DayOfWeek where
+    arbitrary = elements [Time.Monday .. Time.Sunday]
+
+instance CoArbitrary Time.DayOfWeek where
+    coarbitrary = coarbitrary . fromEnum
+
+instance Function Time.DayOfWeek where
+    function = functionMap fromEnum toEnum
+
+instance Arbitrary Time.SystemTime where
+    arbitrary = Time.MkSystemTime <$> arbitrary <*> nano where
+        -- generate 0 often.
+        nano = frequency
+            [ (1, pure 0)
+            , (15, choose (0, 999999999))
+            ]
+    shrink (Time.MkSystemTime s n) = map (uncurry Time.MkSystemTime) (shrink (s, n))
+instance CoArbitrary Time.SystemTime where
+    coarbitrary (Time.MkSystemTime s n) = coarbitrary (s, n)
+instance Function Time.SystemTime where
+    function = functionMap
+        (\(Time.MkSystemTime s n) -> (s, n))
+        (uncurry Time.MkSystemTime)
+
+instance Arbitrary Time.CalendarDiffDays where
+    arbitrary = Time.CalendarDiffDays <$> arbitrary <*> arbitrary
+    shrink (Time.CalendarDiffDays m d) = map (uncurry Time.CalendarDiffDays) (shrink (m, d))
+instance CoArbitrary Time.CalendarDiffDays where
+    coarbitrary (Time.CalendarDiffDays m d) = coarbitrary (m, d)
+instance Function Time.CalendarDiffDays where
+    function = functionMap
+        (\(Time.CalendarDiffDays m d) -> (m, d))
+        (uncurry Time.CalendarDiffDays)
+
+instance Arbitrary Time.CalendarDiffTime where
+    arbitrary = Time.CalendarDiffTime <$> arbitrary <*> arbitrary
+    shrink (Time.CalendarDiffTime m d) = map (uncurry Time.CalendarDiffTime) (shrink (m, d))
+instance CoArbitrary Time.CalendarDiffTime where
+    coarbitrary (Time.CalendarDiffTime m nt) = coarbitrary (m, nt)
+instance Function Time.CalendarDiffTime where
+    function = functionMap
+        (\(Time.CalendarDiffTime m nt) -> (m, nt))
+        (uncurry Time.CalendarDiffTime)
diff --git a/src/Test/QuickCheck/Instances/UnorderedContainers.hs b/src/Test/QuickCheck/Instances/UnorderedContainers.hs
--- a/src/Test/QuickCheck/Instances/UnorderedContainers.hs
+++ b/src/Test/QuickCheck/Instances/UnorderedContainers.hs
@@ -24,6 +24,9 @@
 instance CoArbitrary a => CoArbitrary (HS.HashSet a) where
     coarbitrary = coarbitrary . HS.toList
 
+instance (Hashable a, Eq a, Function a) => Function (HS.HashSet a) where
+    function = functionMap HS.toList HS.fromList
+
 instance (Hashable k, Eq k, Arbitrary k) => Arbitrary1 (HML.HashMap k) where
     liftArbitrary arb =
         HML.fromList <$> liftArbitrary (liftArbitrary2 arbitrary arb)
@@ -36,3 +39,6 @@
 
 instance (CoArbitrary k, CoArbitrary v) => CoArbitrary (HML.HashMap k v) where
     coarbitrary = coarbitrary . HML.toList
+
+instance (Hashable k, Eq k, Function k, Function v) => Function (HML.HashMap k v) where
+    function = functionMap HML.toList HML.fromList
diff --git a/src/Test/QuickCheck/Instances/Vector.hs b/src/Test/QuickCheck/Instances/Vector.hs
--- a/src/Test/QuickCheck/Instances/Vector.hs
+++ b/src/Test/QuickCheck/Instances/Vector.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE TypeOperators #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 module Test.QuickCheck.Instances.Vector () where
 
@@ -7,6 +8,7 @@
 import Prelude.Compat
 
 import Test.QuickCheck
+import Test.QuickCheck.Function ((:->))
 
 import qualified Data.Vector as Vector
 import qualified Data.Vector.Generic as GVector
@@ -28,7 +30,10 @@
 instance CoArbitrary a => CoArbitrary (Vector.Vector a) where
     coarbitrary = coarbitraryVector
 
+instance Function a => Function (Vector.Vector a) where
+    function = functionVector
 
+
 instance (SVector.Storable a, Arbitrary a) => Arbitrary (SVector.Vector a) where
     arbitrary = arbitraryVector
     shrink = shrinkVector
@@ -36,6 +41,9 @@
 instance (SVector.Storable a, CoArbitrary a) => CoArbitrary (SVector.Vector a) where
     coarbitrary = coarbitraryVector
 
+instance (SVector.Storable a, Function a) => Function (SVector.Vector a) where
+    function = functionVector
+
 instance (UVector.Unbox a, Arbitrary a) => Arbitrary (UVector.Vector a) where
     arbitrary = arbitraryVector
     shrink = shrinkVector
@@ -43,6 +51,9 @@
 instance (UVector.Unbox a, CoArbitrary a) => CoArbitrary (UVector.Vector a) where
     coarbitrary = coarbitraryVector
 
+instance (UVector.Unbox a, Function a) => Function (UVector.Vector a) where
+    function = functionVector
+
 arbitraryVector :: (GVector.Vector v a, Arbitrary a) => Gen (v a)
 arbitraryVector = GVector.fromList `fmap` arbitrary
 
@@ -51,3 +62,6 @@
 
 coarbitraryVector :: (GVector.Vector v a, CoArbitrary a) => v a -> Gen b -> Gen b
 coarbitraryVector = coarbitrary . GVector.toList
+
+functionVector :: (GVector.Vector v a, Function a) => (v a -> c) -> v a :-> c
+functionVector = functionMap GVector.toList GVector.fromList
