diff --git a/speculate.cabal b/speculate.cabal
--- a/speculate.cabal
+++ b/speculate.cabal
@@ -1,5 +1,5 @@
 name:                speculate
-version:             0.3.1
+version:             0.3.2
 synopsis:            discovery of properties about Haskell functions
 description:
   Speculate automatically discovers laws about Haskell functions.
@@ -22,7 +22,7 @@
 
 extra-doc-files: README.md
                , TODO.md
-tested-with: GHC==8.0, GHC==7.10, GHC==7.8, GHC==7.6, GHC==7.4
+tested-with: GHC==8.2, GHC==8.0, GHC==7.10, GHC==7.8, GHC==7.6, GHC==7.4
 
 source-repository head
   type:            git
@@ -31,7 +31,7 @@
 source-repository this
   type:            git
   location:        https://github.com/rudymatela/speculate
-  tag:             v0.3.1
+  tag:             v0.3.2
 
 
 library
@@ -67,7 +67,7 @@
                  , Test.Speculate.Utils.Timeout
                  , Test.Speculate.Utils.Tuple
                  , Test.Speculate.Utils.Typeable
-  build-depends: base >= 4 && < 5, leancheck >= 0.6.3, cmdargs, containers
+  build-depends: base >= 4 && < 5, leancheck >= 0.7, cmdargs, containers
   hs-source-dirs:    src
   default-language:  Haskell2010
 
diff --git a/src/Test/Speculate/CondReason.hs b/src/Test/Speculate/CondReason.hs
--- a/src/Test/Speculate/CondReason.hs
+++ b/src/Test/Speculate/CondReason.hs
@@ -76,6 +76,8 @@
           (e':_) -> n $ normalize thy e'
 -- TODO: fix silly code structure in cnormalize!
 
+-- Checks if two expressions are equivalent under a condition
+-- using the conditional theory.
 cequivalent :: Chy -> Expr -> Expr -> Expr -> Bool
 cequivalent chy ce e1 e2 =
   equivalent (unThy chy) (cnormalize chy ce e1) (cnormalize chy ce e2)
diff --git a/src/Test/Speculate/Utils/List.hs b/src/Test/Speculate/Utils/List.hs
--- a/src/Test/Speculate/Utils/List.hs
+++ b/src/Test/Speculate/Utils/List.hs
@@ -10,7 +10,7 @@
 -- Utilities for manipulating lists.
 module Test.Speculate.Utils.List
   ( pairsThat
-  , count, counts, countsBy
+  , count, counts, countsOn, countsBy
   , firsts
   , nubSort, nubSortBy
   , (+++), nubMerge, nubMergeBy, nubMergeOn, nubMerges, nubMergesBy, nubMergeMap
@@ -37,19 +37,13 @@
 
 import Data.List
 import Data.Function (on)
+import Test.LeanCheck.Stats
 
 pairsThat :: (a -> a -> Bool) -> [a] -> [(a,a)]
 pairsThat p xs = [(x,y) | x <- xs, y <- xs, p x y]
 
 count :: Eq a => a -> [a] -> Int
 count x = length . filter (==x)
-
-counts :: Eq a => [a] -> [(a,Int)]
-counts [] = []
-counts (x:xs) = (x,1+count x xs) : counts (filter (/= x) xs)
-
-countsBy :: Eq b => (a -> b) -> [a] -> [(b,Int)]
-countsBy f = counts . map f
 
 firsts :: Eq a => [a] -> [a]
 firsts [] = []
diff --git a/src/Test/Speculate/Utils/Misc.hs b/src/Test/Speculate/Utils/Misc.hs
--- a/src/Test/Speculate/Utils/Misc.hs
+++ b/src/Test/Speculate/Utils/Misc.hs
@@ -18,6 +18,7 @@
 import Data.Tuple
 import Test.Speculate.Utils.String
 import Test.Speculate.Utils.List
+import Test.LeanCheck.Stats
 
 -- easy debug:
 undefined1 :: a
@@ -43,31 +44,10 @@
 thn o  _ = o
 infixr 8 `thn`
 
--- TODO: Add a function like this on LeanCheck?  Not working exactly like
--- this, but something like:
---
--- > > classifyBy somefoo
--- > Int:    9988  99%
--- > Bool:     10   0%
--- > Char:      2   0%
--- > total: 10000 100%
---
--- > > preconditionInfo [precond_1, precond_2, precond_3]
--- > precond_1:    3   0%
--- > precond_2:  100   1%
--- > precond_3: 2345  23%
---
--- > > preconditionInfoT [...]
--- > tier           cond1      cond2      cond3
--- >   0    9       100 1%     303 2%     3821 4%
--- >   1   56       100 1%     303 2%     3821 4%
--- >   2  102       100 1%     303 2%     3821 4%
--- >   3  400       100 1%     303 2%     3821 4%
--- >   4  713       100 1%     303 2%     3821 4%
--- > all 1232       100 1%     303 2%     3821 4%
+-- TODO: Remove this function in favour of LeanCheck's classStats
 reportCountsBy :: (Eq b, Show b) => (a -> b) -> [a] -> IO ()
 reportCountsBy f xs = putStrLn . unlines
-                    . map showCount $ countsBy f xs
+                    . map showCount $ countsOn f xs
   where
   len = length xs
   showCount (x,n) = unquote (show x) ++ ": "
diff --git a/src/Test/Speculate/Utils/Tiers.hs b/src/Test/Speculate/Utils/Tiers.hs
--- a/src/Test/Speculate/Utils/Tiers.hs
+++ b/src/Test/Speculate/Utils/Tiers.hs
@@ -10,9 +10,6 @@
 module Test.Speculate.Utils.Tiers
   ( productsList
   , mapTMaybe
-  , discardT
-  , discardLaterT
-  , partitionT
   , uptoT
   , filterTS
   , discardTS
@@ -20,6 +17,7 @@
 where
 
 import Test.LeanCheck
+import Test.LeanCheck.Tiers
 import Data.Maybe (mapMaybe)
 
 productsList :: [[a]] -> [[a]]
@@ -28,9 +26,6 @@
 mapTMaybe :: (a -> Maybe b) -> [[a]] -> [[b]]
 mapTMaybe f = map (mapMaybe f)
 
-discardT :: (a -> Bool) -> [[a]] -> [[a]]
-discardT p = filterT (not . p)
-
 partitionT :: (a -> Bool) -> [[a]] -> ([[a]],[[a]])
 partitionT p xss = (filterT p xss, discardT p xss)
 
@@ -46,9 +41,3 @@
 
 discardTS :: (Int -> a -> Bool) -> [[a]] -> [[a]]
 discardTS p = filterTS ((not .) . p)
-
-discardLaterT :: (a -> a -> Bool) -> [[a]] -> [[a]]
-discardLaterT d []           = []
-discardLaterT d ([]:xss)     = [] : discardLaterT d xss
-discardLaterT d ((x:xs):xss) = [[x]]
-                            \/ discardLaterT d (discardT (`d` x) (xs:xss))
diff --git a/tests/test-utils.hs b/tests/test-utils.hs
--- a/tests/test-utils.hs
+++ b/tests/test-utils.hs
@@ -26,9 +26,6 @@
                       ==> strictlyOrdered (nubMerge xs (ys::[Int]))
   , and [ nubMerge xs xs == xs | n <- [0..10], let xs = [0..n] ]
 
-  , holds 100 $ \xss -> ordered . concat $ discardLaterT (<=) (xss::[[Int]])
-  , (length . concat $ discardLaterT (<=) [[1..100]]) == 100
-
   , collectOn snd [(1,2),(2,2),(2,3),(3,3)] == [[(1,2),(2,2)],[(2,3),(3,3)]]
   , collectOn fst [(1,2),(2,2),(2,3),(3,3)] == [[(1,2)],[(2,2),(2,3)],[(3,3)]]
   , collectOn (uncurry (+)) [(1,2),(2,2),(2,3),(3,3)] == [[(1,2)],[(2,2)],[(2,3)],[(3,3)]]
