diff --git a/prim-instances.cabal b/prim-instances.cabal
--- a/prim-instances.cabal
+++ b/prim-instances.cabal
@@ -1,38 +1,52 @@
-name:                prim-instances
-version:             0.1.0.0
-synopsis:            prim typeclass instances
-description:         orphan instances for primitive's 'Prim' typeclass.
-                     Types which abstract over a single primitive type
-                     have trivially lawful and sometimes useful instances.
-homepage:            https://github.com/chessai/prim-instances.git
-license:             BSD3
-license-file:        LICENSE
-author:              chessai
-maintainer:          chessai1996@gmail.com
-copyright:           2018 (c) chessai
-category:            Data
-build-type:          Simple
-extra-source-files:  ChangeLog.md
-cabal-version:       >=1.10
+cabal-version: 2.2
+name:
+  prim-instances
+version:
+  0.2
+synopsis:
+  Prim typeclass instances
+description:
+  orphan instances for primitive's 'Prim' typeclass.
+  Types which abstract over a single primitive type
+  (i.e. are well-aligned) have trivially lawful and
+  sometimes useful instances.
+homepage:
+  https://github.com/chessai/prim-instances.git
+license:
+  BSD-3-Clause
+license-file:
+  LICENSE
+author:
+  chessai
+maintainer:
+  chessai <chessai1996@gmail.com>
+copyright:
+  2018 (c) chessai
+category:
+  Data
+build-type:
+  Simple
+extra-source-files:
+  ChangeLog.md
 
 library
-  exposed-modules:     Data.Primitive.Instances
-  build-depends:       base >=4.7 && <4.13, primitive >= 0.6.4.0
-  hs-source-dirs:      src
-  default-language:    Haskell2010
+  exposed-modules:
+    Data.Primitive.Instances
+  build-depends:
+    , base >=4.7 && <4.14
+    , primitive >= 0.6.4 && < 0.8
+  hs-source-dirs:
+    src
+  default-language:
+    Haskell2010
 
 test-suite test
   default-language: Haskell2010
   hs-source-dirs: test
-  main-is: main.hs
+  main-is: Spec.hs
   type: exitcode-stdio-1.0
   build-depends:
-       base >= 4.7 && < 4.12
      , QuickCheck
-     , base-orphans
-     , quickcheck-classes >= 0.4.11.1
-     , quickcheck-instances
-     , primitive >= 0.6.4.0 
-     , prim-instances 
-     , tasty
-     , tasty-quickcheck
+     , base
+     , prim-instances
+     , quickcheck-classes
diff --git a/src/Data/Primitive/Instances.hs b/src/Data/Primitive/Instances.hs
--- a/src/Data/Primitive/Instances.hs
+++ b/src/Data/Primitive/Instances.hs
@@ -1,14 +1,17 @@
-{-# LANGUAGE BangPatterns               #-}
-{-# LANGUAGE CPP                        #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE InstanceSigs               #-}
-{-# LANGUAGE MagicHash                  #-}
-{-# LANGUAGE ScopedTypeVariables        #-}
-{-# LANGUAGE StandaloneDeriving         #-}
+{-# language
+        BangPatterns
+      , CPP
+      , GeneralizedNewtypeDeriving
+      , InstanceSigs
+      , MagicHash
+      , ScopedTypeVariables
+      , StandaloneDeriving
+      , UnboxedTuples
+  #-}
+
 #if __GLASGOW_HASKELL__ >= 800
-{-# LANGUAGE TypeInType                 #-}
+{-# language TypeInType #-}
 #endif
-{-# LANGUAGE UnboxedTuples              #-}
 
 {-# OPTIONS_GHC
       -Weverything
@@ -24,6 +27,7 @@
 module Data.Primitive.Instances () where
 
 import Data.Complex (Complex(..))
+#if !MIN_VERSION_primitive(0,7,0)
 import Data.Functor.Const (Const(..))
 #if MIN_VERSION_base(4,8,0)
 import Data.Functor.Identity (Identity(..))
@@ -31,7 +35,7 @@
 import qualified Data.Monoid as Monoid
 import qualified Data.Semigroup as Semigroup
 import Data.Ord (Down(..))
---import Data.Primitive.ByteArray
+#endif
 import Data.Primitive.Types (Prim(..), defaultSetOffAddr#, defaultSetByteArray#)
 import GHC.Real (Ratio(..))
 import Data.Word (Word64)
@@ -44,7 +48,7 @@
   indexByteArray# arr# i# =
     let x,y :: a
         x = indexByteArray# arr# (2# *# i#)
-        y = indexByteArray# arr# (2# *# i# +# 1#) 
+        y = indexByteArray# arr# (2# *# i# +# 1#)
     in x :+ y
   readByteArray# :: forall s a. (Prim a) => MutableByteArray# s -> Int# -> State# s -> (# State# s, Complex a #)
   readByteArray# arr# i# =
@@ -86,12 +90,12 @@
   {-# INLINE setOffAddr# #-}
 
 instance (Integral a, Prim a) => Prim (Ratio a) where
-  sizeOf# _ = 2# *# sizeOf# (undefined :: a) 
-  alignment# _ = alignment# (undefined :: a) 
+  sizeOf# _ = 2# *# sizeOf# (undefined :: a)
+  alignment# _ = alignment# (undefined :: a)
   indexByteArray# arr# i# =
     let x,y :: a
         x = indexByteArray# arr# (2# *# i#)
-        y = indexByteArray# arr# (2# *# i# +# 1#) 
+        y = indexByteArray# arr# (2# *# i# +# 1#)
     in x :% y
   readByteArray# :: forall s a. (Prim a) => MutableByteArray# s -> Int# -> State# s -> (# State# s, Ratio a #)
   readByteArray# arr# i# =
@@ -132,13 +136,13 @@
   {-# INLINE writeOffAddr# #-}
   {-# INLINE setOffAddr# #-}
 
-instance Prim Fingerprint where 
+instance Prim Fingerprint where
   sizeOf# _ = 2# *# sizeOf# (undefined :: Word64)
   alignment# _ = alignment# (undefined :: Word64)
   indexByteArray# arr# i# =
     let x,y :: Word64
         x = indexByteArray# arr# (2# *# i#)
-        y = indexByteArray# arr# (2# *# i# +# 1#) 
+        y = indexByteArray# arr# (2# *# i# +# 1#)
     in Fingerprint x y
   readByteArray# :: forall s. MutableByteArray# s -> Int# -> State# s -> (# State# s, Fingerprint #)
   readByteArray# arr# i# =
@@ -179,6 +183,8 @@
   {-# INLINE writeOffAddr# #-}
   {-# INLINE setOffAddr# #-}
 
+#if !MIN_VERSION_primitive(0,7,0)
+
 deriving instance Prim a => Prim (Down a)
 #if MIN_VERSION_base(4,8,0)
 deriving instance Prim a => Prim (Identity a)
@@ -193,3 +199,5 @@
 deriving instance Prim a => Prim (Semigroup.Max a)
 #endif
 deriving instance Prim a => Prim (Const a b)
+
+#endif
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,25 @@
+{-# language
+        ScopedTypeVariables
+  #-}
+
+module Main (main) where
+
+import Test.QuickCheck.Classes
+import Test.QuickCheck (Arbitrary(..))
+
+import Data.Complex (Complex(..))
+import GHC.Fingerprint (Fingerprint(..))
+import GHC.Real (Ratio(..))
+import Data.Proxy (Proxy(..))
+
+import Data.Primitive.Instances ()
+
+main :: IO ()
+main = lawsCheckMany
+  [ ("Complex Double", [primLaws (Proxy :: Proxy (Complex Double))])
+  , ("Ratio Double", [primLaws (Proxy :: Proxy (Ratio Int))])
+  , ("Fingerprint", [primLaws (Proxy :: Proxy Fingerprint)])
+  ]
+
+instance Arbitrary Fingerprint where
+  arbitrary = Fingerprint <$> arbitrary <*> arbitrary
diff --git a/test/main.hs b/test/main.hs
deleted file mode 100644
--- a/test/main.hs
+++ /dev/null
@@ -1,39 +0,0 @@
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE StandaloneDeriving #-}
-{-# LANGUAGE TypeApplications #-}
-{-# LANGUAGE DeriveFunctor #-}
-
-import Data.Complex
-import Data.Proxy (Proxy(..))
-import Data.Ratio (Ratio(..))
-import Data.Word (Word64)
-import GHC.Fingerprint (Fingerprint)
-import Test.QuickCheck hiding (Fixed)
-import Test.QuickCheck.Gen (suchThat)
-import Test.QuickCheck.Instances ()
-import Test.Tasty (defaultMain, testGroup, TestTree)
-import Data.Primitive.Instances
-import Data.Primitive.Types (Prim(..))
-import qualified GHC.Num as Num
-import qualified Test.QuickCheck.Classes as QCC
-
-type Laws = QCC.Laws
-
-main :: IO ()
-main = QCC.lawsCheckMany namedTests
-  where
-    namedTests :: [(String, [Laws])]
-    namedTests =
-      [ ("Complex Double", myLaws pComplex)
-      , ("Ratio Int", myLaws pRatio)
-      , ("Fingerprint", myLaws pRatio)
-      ]
-    myLaws :: (Arbitrary a, Show a, Eq a, Prim a) => Proxy a -> [Laws]
-    myLaws p = [QCC.primLaws p]
-
-p :: forall a. Proxy a; p = Proxy
-
-pComplex     = p @(Complex Double)
-pRatio       = p @(Ratio Int)
-pFingerprint = p @Fingerprint
