diff --git a/safe-json.cabal b/safe-json.cabal
--- a/safe-json.cabal
+++ b/safe-json.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.36.0.
+-- This file has been generated from package.yaml by hpack version 0.37.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           safe-json
-version:        1.2.1.0
+version:        1.2.1.1
 synopsis:       Automatic JSON format versioning
 description:    This library aims to make the updating of JSON formats or contents, while keeping backward compatibility, as painless as possible. The way this is achieved is through versioning and defined migration functions to migrate older (or newer) versions to the one used.
                 .
@@ -28,7 +28,7 @@
 license-file:   LICENSE
 build-type:     Simple
 tested-with:
-    GHC == 9.2.8 , GHC == 9.4.8 , GHC == 9.6.6 , GHC == 9.8.4 , GHC == 9.10.1
+    GHC == 9.4.8 , GHC == 9.6.7 , GHC == 9.8.4 , GHC == 9.10.3 , GHC == 9.12.2
 extra-source-files:
     README.md
     ChangeLog.md
@@ -73,7 +73,7 @@
     , tasty-hunit >=0.9.2 && <0.11
     , tasty-quickcheck >=0.8.4 && <0.12
     , text >=1.2.3 && <2.2
-    , time >=1.6.0.1 && <1.15
+    , time >=1.6.0.1 && <1.16
     , unordered-containers >=0.2.9 && <0.3
     , uuid-types >=1.0.3 && <1.1
     , vector >=0.12.0.1 && <0.14
@@ -105,7 +105,7 @@
     , containers >=0.5.7.1 && <0.9
     , dlist >=0.8.0.3 && <2
     , hashable >=1.2.6.1 && <1.6
-    , quickcheck-instances >=0.3.16 && <0.4
+    , quickcheck-instances >=0.3.16 && <0.5
     , safe-json
     , scientific >=0.3.5.2 && <0.4
     , tasty
@@ -113,7 +113,7 @@
     , tasty-quickcheck
     , temporary >=1.2.1.1
     , text >=1.2.3 && <2.2
-    , time >=1.6.0.1 && <1.15
+    , time >=1.6.0.1 && <1.16
     , unordered-containers >=0.2.9 && <0.3
     , uuid >=1.3.13
     , uuid-types >=1.0.3 && <1.1
diff --git a/test/Instances.hs b/test/Instances.hs
--- a/test/Instances.hs
+++ b/test/Instances.hs
@@ -13,13 +13,30 @@
 import qualified Data.Aeson.Key as K
 import qualified Data.Aeson.KeyMap as KM
 #endif
-import Data.DList (DList, fromList, toList)
+import Data.DList as DList (DList, fromList, toList)
 import Data.Int (Int64)
+#if MIN_VERSION_quickcheck_instances(0,4,0)
+import Data.List.NonEmpty as NonEmpty (NonEmpty, fromList, toList)
+import Data.Semigroup as Semigroup (First (..), Last (..), Max (..), Min (..))
+#endif
 import Data.Time (NominalDiffTime)
 import Data.Time.Clock.POSIX (posixSecondsToUTCTime)
 import qualified Data.Vector.Primitive as VP
+#if MIN_VERSION_quickcheck_instances(0,4,0)
+import Numeric.Natural (Natural)
+#endif
 
-import Test.Tasty.QuickCheck (Arbitrary(..))
+import Test.Tasty.QuickCheck (
+  Arbitrary (..),
+#if MIN_VERSION_quickcheck_instances(0,4,0)
+  Arbitrary1 (..),
+  arbitrary1,
+  arbitrarySizedNatural,
+  listOf1,
+  shrink1,
+  shrinkIntegral,
+#endif
+ )
 #if !MIN_VERSION_aeson(2,0,3)
 import Test.Tasty.QuickCheck (oneof, resize)
 import Test.QuickCheck.Arbitrary.Generic (genericShrink)
@@ -38,8 +55,8 @@
   shrink = fmap DotNetTime . shrink . fromDotNetTime
 
 instance Arbitrary a => Arbitrary (DList a) where
-  arbitrary = fromList <$> arbitrary
-  shrink = fmap fromList . shrink . toList
+  arbitrary = DList.fromList <$> arbitrary
+  shrink = fmap DList.fromList . shrink . DList.toList
 
 #if !MIN_VERSION_quickcheck_instances(0,3,32)
 instance (Arbitrary a, VP.Prim a) => Arbitrary (VP.Vector a) where
@@ -88,4 +105,34 @@
   String{} `compare` _        = LT
   Array{}  `compare` Object{} = LT
   _        `compare` _        = GT
+#endif
+
+#if MIN_VERSION_quickcheck_instances(0,4,0)
+instance Arbitrary1 NonEmpty where
+  liftArbitrary arb = NonEmpty.fromList <$> listOf1 arb
+  liftShrink shr xs = [ NonEmpty.fromList xs' | xs' <- liftShrink shr (NonEmpty.toList xs), not (null xs') ]
+
+instance Arbitrary a => Arbitrary (NonEmpty a) where
+  arbitrary = arbitrary1
+  shrink = shrink1
+
+instance Arbitrary a => Arbitrary (Semigroup.Min a) where
+  arbitrary = fmap Semigroup.Min arbitrary
+  shrink = map Semigroup.Min . shrink . Semigroup.getMin
+
+instance Arbitrary a => Arbitrary (Semigroup.Max a) where
+  arbitrary = fmap Semigroup.Max arbitrary
+  shrink = map Semigroup.Max . shrink . Semigroup.getMax
+
+instance Arbitrary a => Arbitrary (Semigroup.First a) where
+  arbitrary = fmap Semigroup.First arbitrary
+  shrink = map Semigroup.First . shrink . Semigroup.getFirst
+
+instance Arbitrary a => Arbitrary (Semigroup.Last a) where
+  arbitrary = fmap Semigroup.Last arbitrary
+  shrink = map Semigroup.Last . shrink . Semigroup.getLast
+
+instance Arbitrary Natural where
+  arbitrary = arbitrarySizedNatural
+  shrink    = shrinkIntegral
 #endif
diff --git a/test/PrimitiveTests.hs b/test/PrimitiveTests.hs
--- a/test/PrimitiveTests.hs
+++ b/test/PrimitiveTests.hs
@@ -4,7 +4,6 @@
 {-# LANGUAGE TypeApplications #-}
 module PrimitiveTests where
 
-
 import Control.Applicative (Const)
 import Data.Aeson (DotNetTime, Value, (.:))
 import qualified Data.Aeson as A
