diff --git a/Changes b/Changes
--- a/Changes
+++ b/Changes
@@ -1,3 +1,6 @@
+0.5.0.1:
+    Switch to QuickCheck 2.10.
+
 0.5.0.0:
     This release supports GHC 7.8, 7.10 and 8.0. GHC 7.6 is no longer supported.
 
diff --git a/arithmoi.cabal b/arithmoi.cabal
--- a/arithmoi.cabal
+++ b/arithmoi.cabal
@@ -1,5 +1,5 @@
 name                : arithmoi
-version             : 0.5.0.0
+version             : 0.5.0.1
 cabal-version       : >= 1.10
 author              : Daniel Fischer
 copyright           : (c) 2011 Daniel Fischer, 2016-2017 Andrew Lelechenko, Carter Schonwald
@@ -128,9 +128,9 @@
                       , arithmoi >= 0.5 && < 0.6
                       , tasty >= 0.10 && < 0.12
                       , tasty-smallcheck >= 0.8 && < 0.9
-                      , tasty-quickcheck >= 0.8 && < 0.9
+                      , tasty-quickcheck >= 0.9 && < 0.10
                       , tasty-hunit >= 0.9 && < 0.10
-                      , QuickCheck >= 2.7.6 && < 2.10
+                      , QuickCheck >= 2.10 && < 2.11
                       , smallcheck >= 1.1 && < 1.2
                       , transformers >= 0.5
                       , integer-gmp < 1.1
@@ -158,6 +158,6 @@
                   , Math.NumberTheory.Primes.TestingTests
                   , Math.NumberTheory.TestUtils
                   , Math.NumberTheory.TestUtils.Wrappers
-                  , Math.NumberTheory.TestUtils.Compose
+                  , Math.NumberTheory.TestUtils.MyCompose
                   , Math.NumberTheory.UniqueFactorisationTests
                   , Math.NumberTheory.ZetaTests
diff --git a/test-suite/Math/NumberTheory/ModuliTests.hs b/test-suite/Math/NumberTheory/ModuliTests.hs
--- a/test-suite/Math/NumberTheory/ModuliTests.hs
+++ b/test-suite/Math/NumberTheory/ModuliTests.hs
@@ -23,7 +23,6 @@
 import Data.Bits
 import Data.List (tails, nub)
 import Data.Maybe
-import Data.Functor.Compose
 
 import Math.NumberTheory.Moduli
 import Math.NumberTheory.TestUtils
@@ -32,42 +31,42 @@
 unwrapPP (Prime p, Power e) = (p, e)
 
 -- | Check that 'jacobi' matches 'jacobi''.
-jacobiProperty1 :: (Integral a, Bits a) => AnySign a -> (Compose Positive Odd) a -> Bool
-jacobiProperty1 (AnySign a) (Compose (Positive (Odd n))) = n == 1 && j == 1 || n > 1 && j == j'
+jacobiProperty1 :: (Integral a, Bits a) => AnySign a -> (MyCompose Positive Odd) a -> Bool
+jacobiProperty1 (AnySign a) (MyCompose (Positive (Odd n))) = n == 1 && j == 1 || n > 1 && j == j'
   where
     j = jacobi a n
     j' = jacobi' a n
 
 -- https://en.wikipedia.org/wiki/Jacobi_symbol#Properties, item 2
-jacobiProperty2 :: (Integral a, Bits a) => AnySign a -> (Compose Positive Odd) a -> Bool
-jacobiProperty2 (AnySign a) (Compose (Positive (Odd n)))
+jacobiProperty2 :: (Integral a, Bits a) => AnySign a -> (MyCompose Positive Odd) a -> Bool
+jacobiProperty2 (AnySign a) (MyCompose (Positive (Odd n)))
   =  a + n < a -- check overflow
   || jacobi a n == jacobi (a + n) n
 
 -- https://en.wikipedia.org/wiki/Jacobi_symbol#Properties, item 3
-jacobiProperty3 :: (Integral a, Bits a) => AnySign a -> (Compose Positive Odd) a -> Bool
-jacobiProperty3 (AnySign a) (Compose (Positive (Odd n))) = j == 0 && g /= 1 || abs j == 1 && g == 1
+jacobiProperty3 :: (Integral a, Bits a) => AnySign a -> (MyCompose Positive Odd) a -> Bool
+jacobiProperty3 (AnySign a) (MyCompose (Positive (Odd n))) = j == 0 && g /= 1 || abs j == 1 && g == 1
   where
     j = jacobi a n
     g = gcd a n
 
 -- https://en.wikipedia.org/wiki/Jacobi_symbol#Properties, item 4
-jacobiProperty4 :: (Integral a, Bits a) => AnySign a -> AnySign a -> (Compose Positive Odd) a -> Bool
-jacobiProperty4 (AnySign a) (AnySign b) (Compose (Positive (Odd n))) = jacobi (a * b) n == jacobi a n * jacobi b n
+jacobiProperty4 :: (Integral a, Bits a) => AnySign a -> AnySign a -> (MyCompose Positive Odd) a -> Bool
+jacobiProperty4 (AnySign a) (AnySign b) (MyCompose (Positive (Odd n))) = jacobi (a * b) n == jacobi a n * jacobi b n
 
-jacobiProperty4_Integer :: AnySign Integer -> AnySign Integer -> (Compose Positive Odd) Integer -> Bool
+jacobiProperty4_Integer :: AnySign Integer -> AnySign Integer -> (MyCompose Positive Odd) Integer -> Bool
 jacobiProperty4_Integer = jacobiProperty4
 
 -- https://en.wikipedia.org/wiki/Jacobi_symbol#Properties, item 5
-jacobiProperty5 :: (Integral a, Bits a) => AnySign a -> (Compose Positive Odd) a -> (Compose Positive Odd) a -> Bool
-jacobiProperty5 (AnySign a) (Compose (Positive (Odd m))) (Compose (Positive (Odd n))) = jacobi a (m * n) == jacobi a m * jacobi a n
+jacobiProperty5 :: (Integral a, Bits a) => AnySign a -> (MyCompose Positive Odd) a -> (MyCompose Positive Odd) a -> Bool
+jacobiProperty5 (AnySign a) (MyCompose (Positive (Odd m))) (MyCompose (Positive (Odd n))) = jacobi a (m * n) == jacobi a m * jacobi a n
 
-jacobiProperty5_Integer :: AnySign Integer -> (Compose Positive Odd) Integer -> (Compose Positive Odd) Integer -> Bool
+jacobiProperty5_Integer :: AnySign Integer -> (MyCompose Positive Odd) Integer -> (MyCompose Positive Odd) Integer -> Bool
 jacobiProperty5_Integer = jacobiProperty5
 
 -- https://en.wikipedia.org/wiki/Jacobi_symbol#Properties, item 6
-jacobiProperty6 :: (Integral a, Bits a) => (Compose Positive Odd) a -> (Compose Positive Odd) a -> Bool
-jacobiProperty6 (Compose (Positive (Odd m))) (Compose (Positive (Odd n))) = gcd m n /= 1 || jacobi m n * jacobi n m == (if m `mod` 4 == 1 || n `mod` 4 == 1 then 1 else -1)
+jacobiProperty6 :: (Integral a, Bits a) => (MyCompose Positive Odd) a -> (MyCompose Positive Odd) a -> Bool
+jacobiProperty6 (MyCompose (Positive (Odd m))) (MyCompose (Positive (Odd n))) = gcd m n /= 1 || jacobi m n * jacobi n m == (if m `mod` 4 == 1 || n `mod` 4 == 1 then 1 else -1)
 
 -- | Check that 'invertMod' inverts numbers modulo.
 invertModProperty :: AnySign Integer -> Positive Integer -> Bool
diff --git a/test-suite/Math/NumberTheory/TestUtils.hs b/test-suite/Math/NumberTheory/TestUtils.hs
--- a/test-suite/Math/NumberTheory/TestUtils.hs
+++ b/test-suite/Math/NumberTheory/TestUtils.hs
@@ -33,6 +33,7 @@
 
 module Math.NumberTheory.TestUtils
   ( module Math.NumberTheory.TestUtils.Wrappers
+  , module Math.NumberTheory.TestUtils.MyCompose
   , module Test.SmallCheck.Series
   , Large(..)
   , testIntegralProperty
@@ -58,7 +59,7 @@
 
 import Math.NumberTheory.GaussianIntegers (GaussianInteger(..))
 
-import Math.NumberTheory.TestUtils.Compose ()
+import Math.NumberTheory.TestUtils.MyCompose
 import Math.NumberTheory.TestUtils.Wrappers
 
 instance Monad m => Serial m Word where
@@ -67,11 +68,9 @@
     where
       nats = generate $ \d -> if d > 0 then [1 .. fromInteger (toInteger d)] else empty
 
-#if !(MIN_VERSION_base(4,8,0)) && !(MIN_VERSION_QuickCheck(2,9,0))
 instance Arbitrary Natural where
   arbitrary = fromInteger <$> (arbitrary `suchThat` (>= 0))
   shrink = map fromInteger . filter (>= 0) . shrink . toInteger
-#endif
 
 instance Monad m => Serial m Natural where
   series =
diff --git a/test-suite/Math/NumberTheory/TestUtils/Compose.hs b/test-suite/Math/NumberTheory/TestUtils/Compose.hs
deleted file mode 100644
--- a/test-suite/Math/NumberTheory/TestUtils/Compose.hs
+++ /dev/null
@@ -1,39 +0,0 @@
--- |
--- Module:      Math.NumberTheory.TestUtils.Compose
--- Copyright:   (c) 2016 Andrew Lelechenko
--- Licence:     MIT
--- Maintainer:  Andrew Lelechenko <andrew.lelechenko@gmail.com>
--- Stability:   Provisional
--- Portability: Non-portable (GHC extensions)
---
--- Utils to test Math.NumberTheory
---
-
-{-# LANGUAGE DeriveGeneric              #-}
-{-# LANGUAGE FlexibleContexts           #-}
-{-# LANGUAGE FlexibleInstances          #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE MultiParamTypeClasses      #-}
-{-# LANGUAGE StandaloneDeriving         #-}
-{-# LANGUAGE UndecidableInstances       #-}
-
-{-# OPTIONS_GHC -fno-warn-orphans       #-}
-
-module Math.NumberTheory.TestUtils.Compose where
-
-import Data.Functor.Classes
-import Data.Functor.Compose
-
-import Test.Tasty.QuickCheck (Arbitrary)
-import Test.SmallCheck.Series (Serial)
-
-deriving instance Num (f (g a))     => Num (Compose f g a)
-deriving instance Enum (f (g a))    => Enum (Compose f g a)
-deriving instance Bounded (f (g a)) => Bounded (Compose f g a)
-
-deriving instance (Ord1 f, Ord1 g, Ord a, Real (f (g a)))     => Real (Compose f g a)
-deriving instance (Ord1 f, Ord1 g, Ord a, Integral (f (g a))) => Integral (Compose f g a)
-
-deriving instance Arbitrary (f (g a)) => Arbitrary (Compose f g a)
-
-instance (Monad m, Serial m (f (g a))) => Serial m (Compose f g a)
diff --git a/test-suite/Math/NumberTheory/TestUtils/MyCompose.hs b/test-suite/Math/NumberTheory/TestUtils/MyCompose.hs
new file mode 100644
--- /dev/null
+++ b/test-suite/Math/NumberTheory/TestUtils/MyCompose.hs
@@ -0,0 +1,31 @@
+-- |
+-- Module:      Math.NumberTheory.TestUtils.MyCompose
+-- Copyright:   (c) 2016-2017 Andrew Lelechenko
+-- Licence:     MIT
+-- Maintainer:  Andrew Lelechenko <andrew.lelechenko@gmail.com>
+-- Stability:   Provisional
+-- Portability: Non-portable (GHC extensions)
+--
+-- Utils to test Math.NumberTheory
+--
+
+{-# LANGUAGE DeriveFunctor              #-}
+{-# LANGUAGE DeriveGeneric              #-}
+{-# LANGUAGE FlexibleContexts           #-}
+{-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
+
+module Math.NumberTheory.TestUtils.MyCompose
+  ( MyCompose(..)
+  ) where
+
+import GHC.Generics (Generic)
+
+import Test.QuickCheck (Arbitrary)
+import Test.SmallCheck.Series (Serial)
+
+newtype MyCompose f g a = MyCompose { getMyCompose :: f (g a) }
+  deriving (Eq, Ord, Show, Functor, Num, Enum, Bounded, Real, Integral, Arbitrary, Generic)
+
+instance (Monad m, Serial m (f (g a))) => Serial m (MyCompose f g a)
