diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -4,6 +4,12 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to the [Haskell Package Versioning Policy](https://pvp.haskell.org/).
 
+## [0.4.14.2] - 2018-09-12
+### Change
+- Support QuickCheck-2.12
+- Fix compilation for containers<0.5.9
+- Fix compilation with QuickCheck-2.9
+
 ## [0.4.14.1] - 2018-07-24
 ### Change
 - Build correctly when dependency on semigroupoids is disabled.
diff --git a/quickcheck-classes.cabal b/quickcheck-classes.cabal
--- a/quickcheck-classes.cabal
+++ b/quickcheck-classes.cabal
@@ -1,5 +1,5 @@
 name: quickcheck-classes
-version: 0.4.14.1
+version: 0.4.14.2
 synopsis: QuickCheck common typeclasses
 description:
   This library provides QuickCheck properties to ensure
@@ -86,7 +86,7 @@
     , QuickCheck >= 2.9
     , transformers >= 0.3 && < 0.6
     , primitive >= 0.6.1 && < 0.7
-    , containers
+    , containers >= 0.5
     , semigroups
     , tagged
   if flag(aeson)
diff --git a/src/Test/QuickCheck/Classes.hs b/src/Test/QuickCheck/Classes.hs
--- a/src/Test/QuickCheck/Classes.hs
+++ b/src/Test/QuickCheck/Classes.hs
@@ -247,7 +247,7 @@
         putStr (typeClassName ++ ": " ++ name ++ " ")
         r <- quickCheckResult p
         return $ case r of
-          Success _ _ _ -> Good
+          Success{} -> Good
           _ -> Bad
   putStrLn ""
   case r of
diff --git a/src/Test/QuickCheck/Classes/Alt.hs b/src/Test/QuickCheck/Classes/Alt.hs
--- a/src/Test/QuickCheck/Classes/Alt.hs
+++ b/src/Test/QuickCheck/Classes/Alt.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Alt
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
 #if defined(VERSION_semigroupoids)
     altLaws
+#endif
 #endif
 #endif
 ) where
diff --git a/src/Test/QuickCheck/Classes/Alternative.hs b/src/Test/QuickCheck/Classes/Alternative.hs
--- a/src/Test/QuickCheck/Classes/Alternative.hs
+++ b/src/Test/QuickCheck/Classes/Alternative.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Alternative
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
     alternativeLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Control.Applicative (Alternative(..))
diff --git a/src/Test/QuickCheck/Classes/Applicative.hs b/src/Test/QuickCheck/Classes/Applicative.hs
--- a/src/Test/QuickCheck/Classes/Applicative.hs
+++ b/src/Test/QuickCheck/Classes/Applicative.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Applicative
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
     applicativeLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Control.Applicative
diff --git a/src/Test/QuickCheck/Classes/Apply.hs b/src/Test/QuickCheck/Classes/Apply.hs
--- a/src/Test/QuickCheck/Classes/Apply.hs
+++ b/src/Test/QuickCheck/Classes/Apply.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Apply
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
 #if defined(VERSION_semigroupoids)
     applyLaws
+#endif
 #endif
 #endif
 ) where
diff --git a/src/Test/QuickCheck/Classes/Bifunctor.hs b/src/Test/QuickCheck/Classes/Bifunctor.hs
--- a/src/Test/QuickCheck/Classes/Bifunctor.hs
+++ b/src/Test/QuickCheck/Classes/Bifunctor.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Bifunctor
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,5,0)
     bifunctorLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Data.Bifunctor(Bifunctor(..))
diff --git a/src/Test/QuickCheck/Classes/Category.hs b/src/Test/QuickCheck/Classes/Category.hs
--- a/src/Test/QuickCheck/Classes/Category.hs
+++ b/src/Test/QuickCheck/Classes/Category.hs
@@ -5,10 +5,12 @@
 
 module Test.QuickCheck.Classes.Category
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,5,0)
     categoryLaws
   , commutativeCategoryLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Prelude hiding (id, (.))
diff --git a/src/Test/QuickCheck/Classes/Common.hs b/src/Test/QuickCheck/Classes/Common.hs
--- a/src/Test/QuickCheck/Classes/Common.hs
+++ b/src/Test/QuickCheck/Classes/Common.hs
@@ -18,7 +18,7 @@
   , LastNothing(..)
   , Bottom(..)
   , LinearEquation(..)
-#if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
+#if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,5,0)
   , LinearEquationM(..)
 #endif
   , QuadraticEquation(..)
@@ -186,11 +186,16 @@
 #endif
 #endif
 
+#if MIN_VERSION_QuickCheck(2,10,0)
 instance Arbitrary1 Triple where
   liftArbitrary x = Triple <$> x <*> x <*> x
 
 instance Arbitrary a => Arbitrary (Triple a) where
   arbitrary = liftArbitrary arbitrary
+#else
+instance Arbitrary a => Arbitrary (Triple a) where
+  arbitrary = Triple <$> arbitrary <*> arbitrary <*> arbitrary
+#endif
 
 instance Functor Triple where
   fmap f (Triple a b c) = Triple (f a) (f b) (f c)
@@ -274,10 +279,12 @@
 instance (Show1 f, Show a) => Show (Apply f a) where
   showsPrec p = showsPrec1 p . getApply
 
+#if MIN_VERSION_QuickCheck(2,10,0)
 instance (Arbitrary1 f, Arbitrary a) => Arbitrary (Apply f a) where
   arbitrary = fmap Apply arbitrary1
   shrink = map Apply . shrink1 . getApply
 #endif
+#endif
 
 foldMapA :: (Foldable t, Monoid m, Semigroup m, Applicative f) => (a -> f m) -> t a -> f m
 foldMapA f = getApply . foldMap (Apply . f)
@@ -292,10 +299,12 @@
 instance (Show2 f, Show a, Show b) => Show (Apply2 f a b) where
   showsPrec p = showsPrec2 p . getApply2
 
+#if MIN_VERSION_QuickCheck(2,10,0)
 instance (Arbitrary2 f, Arbitrary a, Arbitrary b) => Arbitrary (Apply2 f a b) where
   arbitrary = fmap Apply2 arbitrary2
   shrink = fmap Apply2 . shrink2 . getApply2
 #endif
+#endif
 
 data LinearEquation = LinearEquation
   { _linearEquationLinear :: Integer
@@ -336,12 +345,14 @@
     . showString " else "
     . showsPrec1 0 b
 
+#if MIN_VERSION_QuickCheck(2,10,0)
 instance Arbitrary1 m => Arbitrary (LinearEquationM m) where
   arbitrary = liftA2 LinearEquationM arbitrary1 arbitrary1
   shrink (LinearEquationM a b) = L.concat
     [ map (\x -> LinearEquationM x b) (shrink1 a)
     , map (\x -> LinearEquationM a x) (shrink1 b)
     ]
+#endif
 #endif
 
 instance Arbitrary LinearEquation where
diff --git a/src/Test/QuickCheck/Classes/Foldable.hs b/src/Test/QuickCheck/Classes/Foldable.hs
--- a/src/Test/QuickCheck/Classes/Foldable.hs
+++ b/src/Test/QuickCheck/Classes/Foldable.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Foldable
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
     foldableLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Data.Monoid
diff --git a/src/Test/QuickCheck/Classes/Functor.hs b/src/Test/QuickCheck/Classes/Functor.hs
--- a/src/Test/QuickCheck/Classes/Functor.hs
+++ b/src/Test/QuickCheck/Classes/Functor.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Functor
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
     functorLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Data.Functor
diff --git a/src/Test/QuickCheck/Classes/IsList.hs b/src/Test/QuickCheck/Classes/IsList.hs
--- a/src/Test/QuickCheck/Classes/IsList.hs
+++ b/src/Test/QuickCheck/Classes/IsList.hs
@@ -53,8 +53,13 @@
 import Data.Proxy (Proxy)
 import Data.Foldable (foldlM)
 import Data.Traversable (traverse)
-import Test.QuickCheck (Property,Arbitrary,Function,CoArbitrary,(===),property,
-  applyFun,applyFun2,NonNegative(..),Fun)
+import Test.QuickCheck (Property,Arbitrary,CoArbitrary,(===),property,
+  NonNegative(..))
+#if MIN_VERSION_QuickCheck(2,10,0)
+import Test.QuickCheck.Function (Function,Fun,applyFun,applyFun2)
+#else
+import Test.QuickCheck.Function (Function,Fun,apply)
+#endif
 import qualified Data.List as L
 
 import Test.QuickCheck.Classes.Common (Laws(..), myForAllShrink)
@@ -235,4 +240,12 @@
 
 stApplyFun2 :: Fun (a,b) c -> a -> b -> ST s c
 stApplyFun2 f a b = return (applyFun2 f a b)
+
+#if !MIN_VERSION_QuickCheck(2,10,0)
+applyFun :: Fun a b -> (a -> b)
+applyFun = apply
+
+applyFun2 :: Fun (a, b) c -> (a -> b -> c)
+applyFun2 = curry . apply
+#endif
 #endif
diff --git a/src/Test/QuickCheck/Classes/Monad.hs b/src/Test/QuickCheck/Classes/Monad.hs
--- a/src/Test/QuickCheck/Classes/Monad.hs
+++ b/src/Test/QuickCheck/Classes/Monad.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Monad
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
     monadLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Control.Applicative
diff --git a/src/Test/QuickCheck/Classes/MonadFail.hs b/src/Test/QuickCheck/Classes/MonadFail.hs
--- a/src/Test/QuickCheck/Classes/MonadFail.hs
+++ b/src/Test/QuickCheck/Classes/MonadFail.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.MonadFail
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) && MIN_VERSION_transformers(0,4,0)
     monadFailLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Control.Applicative
diff --git a/src/Test/QuickCheck/Classes/MonadPlus.hs b/src/Test/QuickCheck/Classes/MonadPlus.hs
--- a/src/Test/QuickCheck/Classes/MonadPlus.hs
+++ b/src/Test/QuickCheck/Classes/MonadPlus.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.MonadPlus
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
     monadPlusLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Test.QuickCheck hiding ((.&.))
diff --git a/src/Test/QuickCheck/Classes/MonadZip.hs b/src/Test/QuickCheck/Classes/MonadZip.hs
--- a/src/Test/QuickCheck/Classes/MonadZip.hs
+++ b/src/Test/QuickCheck/Classes/MonadZip.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.MonadZip
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
     monadZipLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Control.Applicative
diff --git a/src/Test/QuickCheck/Classes/Plus.hs b/src/Test/QuickCheck/Classes/Plus.hs
--- a/src/Test/QuickCheck/Classes/Plus.hs
+++ b/src/Test/QuickCheck/Classes/Plus.hs
@@ -5,10 +5,12 @@
 
 module Test.QuickCheck.Classes.Plus
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
 #if defined(VERSION_semigroupoids)
     plusLaws
   , extendedPlusLaws
+#endif
 #endif
 #endif
   ) where
diff --git a/src/Test/QuickCheck/Classes/Semigroupoid.hs b/src/Test/QuickCheck/Classes/Semigroupoid.hs
--- a/src/Test/QuickCheck/Classes/Semigroupoid.hs
+++ b/src/Test/QuickCheck/Classes/Semigroupoid.hs
@@ -5,12 +5,14 @@
 
 module Test.QuickCheck.Classes.Semigroupoid
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,5,0)
 #if defined(VERSION_semigroupoids)
     semigroupoidLaws
   , commutativeSemigroupoidLaws
 #endif
-#endif  
+#endif
+#endif
   ) where
 
 import Prelude hiding (id, (.))
diff --git a/src/Test/QuickCheck/Classes/Traversable.hs b/src/Test/QuickCheck/Classes/Traversable.hs
--- a/src/Test/QuickCheck/Classes/Traversable.hs
+++ b/src/Test/QuickCheck/Classes/Traversable.hs
@@ -5,9 +5,11 @@
 
 module Test.QuickCheck.Classes.Traversable
   (
+#if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
     traversableLaws
-#endif  
+#endif
+#endif
   ) where
 
 import Data.Foldable (foldMap)
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -45,7 +45,11 @@
 
 main :: IO ()
 main = do
+#if defined(VERSION_semigroupoids)
+#if MIN_VERSION_containers(0,5,9)
   quickCheck prop_map_apply_equals
+#endif
+#endif
   lawsCheckMany allPropsApplied
 
 allPropsApplied :: [(String,[Laws])]
@@ -62,11 +66,13 @@
 #if MIN_VERSION_QuickCheck(2,10,0)
 #if MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)
 #if defined(VERSION_semigroupoids)
+#if MIN_VERSION_containers(0,5,9)
   , ("Map", someHigherLaws (Proxy1 :: Proxy1 (Map Int)))
   , ("Pound", someHigherLaws (Proxy1 :: Proxy1 (Pound Int)))
 #endif
 #endif
 #endif
+#endif
 #if MIN_VERSION_base(4,7,0)
   , ("Vector",[isListLaws (Proxy :: Proxy (Vector Word))])
 #endif
@@ -158,7 +164,7 @@
 #endif
 
 newtype Pound k v = Pound { getPound :: Map k v }
-#if MIN_VERSION_QuickCheck(2,10,0) && (MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0))
+#if MIN_VERSION_QuickCheck(2,10,0) && (MIN_VERSION_base(4,9,0) || MIN_VERSION_transformers(0,4,0)) && MIN_VERSION_containers(0,5,9)
   deriving (Eq,Functor,Show,Arbitrary,Arbitrary1,Eq1,Show1)
 #else
   deriving (Eq,Show,Arbitrary)
