diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,8 @@
+## 0.5 [2022-06-15]
+
+* `Eq` is a superclass of `Grouping`, `Ord` is a superclass of `Ordering`.
+* Drop support for GHC prior 8
+
 ## 0.4.1 [2021-01-08]
 
 * GHC-9.0 compatibility
diff --git a/common/Utils.hs b/common/Utils.hs
--- a/common/Utils.hs
+++ b/common/Utils.hs
@@ -50,7 +50,7 @@
         | HS.member x s = go s xs
         | otherwise     = x : go (HS.insert x s) xs
 
- -- | Sort via vector.
+-- | Sort via vector.
 introsort :: Ord a => [a] -> [a]
 introsort xs = runST $ do
     v <- V.unsafeThaw (V.fromList xs)
diff --git a/discrimination.cabal b/discrimination.cabal
--- a/discrimination.cabal
+++ b/discrimination.cabal
@@ -1,6 +1,6 @@
 name:          discrimination
 category:      Data, Sorting
-version:       0.4.1
+version:       0.5
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
@@ -11,7 +11,7 @@
 bug-reports:   http://github.com/ekmett/discrimination/issues
 copyright:     Copyright (C) 2014-2015 Edward A. Kmett
 build-type:    Simple
-tested-with:   GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.4, GHC == 8.10.3
+tested-with:   GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.4, GHC == 8.10.7, GHC == 9.0.2, GHC == 9.2.3, GHC == 9.4.1
 synopsis:      Fast generic linear-time sorting, joins and container construction.
 description:
   This package provides fast, generic, linear-time discrimination and sorting.
@@ -43,21 +43,21 @@
 
   build-depends:
     array         >= 0.5.1.0 && < 0.6,
-    base          >= 4.8     && < 5,
+    base          >= 4.9     && < 5,
     containers    >= 0.5.6.2 && < 0.7,
     contravariant >= 1.5.3   && < 2,
     deepseq       >= 1.4.1.1 && < 1.5,
     ghc-prim,
-    hashable      >= 1.2.7.0 && < 1.4,
+    hashable      >= 1.2.7.0 && < 1.5,
     primitive     >= 0.7.1.0 && < 0.8,
     promises      >= 0.3     && < 0.4,
-    transformers  >= 0.4.2.0 && < 0.6
+    transformers  >= 0.4.2.0 && < 0.7
 
   if !impl(ghc >=8.0)
     build-depends: semigroups >= 0.18.5 && < 1
 
   if impl(ghc >= 9.0)
-    build-depends: ghc-bignum >= 1.0 && < 1.1
+    build-depends: ghc-bignum >= 1.0 && < 1.3
   else
     build-depends: integer-gmp >= 1.0 && < 1.1
 
diff --git a/src/Data/Discrimination/Grouping.hs b/src/Data/Discrimination/Grouping.hs
--- a/src/Data/Discrimination/Grouping.hs
+++ b/src/Data/Discrimination/Grouping.hs
@@ -47,6 +47,7 @@
 import Data.Word
 import Numeric.Natural (Natural)
 import Prelude hiding (read, concat, mapM_)
+import Data.Functor.Classes (Eq1 (..))
 
 -- | Productive Stable Unordered Discriminator
 
@@ -131,7 +132,7 @@
 --
 -- /Note:/ 'Eq' is a moral super class of 'Grouping'.
 -- It isn't because of some missing instances.
-class Grouping a where
+class Eq a => Grouping a where
   -- | For every surjection @f@,
   --
   -- @
@@ -181,13 +182,14 @@
 #endif
   grouping = divide (\r -> (numerator r, denominator r)) grouping grouping
 
-instance (Grouping1 f, Grouping1 g, Grouping a) => Grouping (Compose f g a) where
-  grouping = getCompose `contramap` grouping1 (grouping1 grouping)
-
-class Grouping1 f where
+class Eq1 f => Grouping1 f where
   grouping1 :: Group a -> Group (f a)
   default grouping1 :: Deciding1 Grouping f => Group a -> Group (f a)
   grouping1 = deciding1 (Proxy :: Proxy Grouping) grouping
+
+instance (Grouping1 f, Grouping1 g, Grouping a) => Grouping (Compose f g a) where
+  grouping = getCompose `contramap` grouping1 (grouping1 grouping)
+
 
 instance Grouping1 []
 instance Grouping1 Maybe
diff --git a/src/Data/Discrimination/Internal.hs b/src/Data/Discrimination/Internal.hs
--- a/src/Data/Discrimination/Internal.hs
+++ b/src/Data/Discrimination/Internal.hs
@@ -100,7 +100,7 @@
 {-# INLINE naturalCases #-}
 
 -- We need to reverse the limb array. Its stored least-significant word first
--- but for comparasion to work right we need most-significant words first.
+-- but for comparison to work right we need most-significant words first.
 #ifdef MIN_VERSION_ghc_bignum
 decomposeBigNat :: ByteArray# -> (Int, [Word])
 decomposeBigNat ba = let pa = PrimArray ba :: PrimArray Word in (sizeofPrimArray pa, primArrayToReverseList pa)
diff --git a/src/Data/Discrimination/Sorting.hs b/src/Data/Discrimination/Sorting.hs
--- a/src/Data/Discrimination/Sorting.hs
+++ b/src/Data/Discrimination/Sorting.hs
@@ -55,6 +55,7 @@
 import Data.Word
 import Numeric.Natural (Natural)
 import Prelude hiding (read, concat)
+import Data.Functor.Classes (Ord1 (..))
 
 -- $setup
 -- >>> import qualified Data.Map as Map
@@ -112,7 +113,7 @@
 -- @
 -- 'sortingCompare' x y ≡ 'compare' x y
 -- @
-class Grouping a => Sorting a where
+class (Grouping a, Ord a) => Sorting a where
   -- | For every strictly monotone-increasing function @f@:
   --
   -- @
@@ -189,7 +190,7 @@
 instance (Sorting1 f, Sorting1 g, Sorting a) => Sorting (Compose f g a) where
   sorting = getCompose `contramap` sorting1 (sorting1 sorting)
 
-class Grouping1 f => Sorting1 f  where
+class (Grouping1 f, Ord1 f) => Sorting1 f  where
   sorting1 :: Sort a -> Sort (f a)
   default sorting1 :: Deciding1 Sorting f => Sort a -> Sort (f a)
   sorting1 = deciding1 (Proxy :: Proxy Sorting) sorting
