diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Unreleased
 
+# 0.12.1.0
+
+- GHC 8.4.1 support:
+- Update 'base' dependency bounds
+- Add `Semigroup` instance to the `Prod` type
+
 # 0.12.0.1
 
 - Update 'base' dependency bounds
diff --git a/Earley.cabal b/Earley.cabal
--- a/Earley.cabal
+++ b/Earley.cabal
@@ -1,5 +1,5 @@
 name:                Earley
-version:             0.12.0.1
+version:             0.12.1.0
 synopsis:            Parsing all context-free grammars using Earley's algorithm.
 description:         See <https://www.github.com/ollef/Earley> for more
                      information and
@@ -13,7 +13,7 @@
 category:            Parsing
 build-type:          Simple
 cabal-version:       >=1.10
-tested-with:         GHC ==7.6.3, GHC==7.8.4, GHC==7.10.3, GHC==8.0.2, GHC==8.2.1
+tested-with:         GHC==7.6.3, GHC==7.8.4, GHC==7.10.3, GHC==8.0.2, GHC==8.2.1, GHC==8.4.1
 
 extra-source-files:
                       README.md
@@ -38,7 +38,9 @@
                        Text.Earley.Mixfix,
                        Text.Earley.Parser,
                        Text.Earley.Parser.Internal
-  build-depends:       base >=4.6 && <4.11, ListLike >=4.1
+  build-depends:       base >=4.6 && <5, ListLike >=4.1
+  if impl(ghc < 8.0)
+    build-depends:     semigroups >=0.18
   default-language:    Haskell2010
   ghc-options:         -Wall
                        -funbox-strict-fields
@@ -119,17 +121,11 @@
   type:                exitcode-stdio-1.0
   hs-source-dirs:      . bench
   main-is:             BenchAll.hs
-  build-depends:       base, deepseq, criterion >=1.1, parsec >=3.1, ListLike
+  build-depends:       base, Earley, ListLike, deepseq, criterion >=1.1, parsec >=3.1
+  if impl(ghc < 8.0)
+    build-depends:     semigroups >=0.18
   default-language:    Haskell2010
   ghc-options:         -Wall
-  other-modules:
-                       Text.Earley,
-                       Text.Earley.Derived,
-                       Text.Earley.Generator,
-                       Text.Earley.Generator.Internal,
-                       Text.Earley.Grammar,
-                       Text.Earley.Parser,
-                       Text.Earley.Parser.Internal
 
 test-suite tests
   type:                exitcode-stdio-1.0
diff --git a/Text/Earley/Generator/Internal.hs b/Text/Earley/Generator/Internal.hs
--- a/Text/Earley/Generator/Internal.hs
+++ b/Text/Earley/Generator/Internal.hs
@@ -13,6 +13,7 @@
 #if !MIN_VERSION_base(4,8,0)
 import Data.Monoid
 #endif
+import Data.Semigroup
 
 -------------------------------------------------------------------------------
 -- * Concrete rules and productions
@@ -86,6 +87,9 @@
   Results stxs >>= f = Results $ do
     xs <- stxs
     concat <$> mapM (\(x, ts) -> fmap (\(y, ts') -> (y, ts' ++ ts)) <$> unResults (f x)) xs
+
+instance Semigroup (Results s t a) where
+  (<>) = (<|>)
 
 instance Monoid (Results s t a) where
   mempty = empty
diff --git a/Text/Earley/Grammar.hs b/Text/Earley/Grammar.hs
--- a/Text/Earley/Grammar.hs
+++ b/Text/Earley/Grammar.hs
@@ -16,6 +16,7 @@
 #if !MIN_VERSION_base(4,8,0)
 import Data.Monoid
 #endif
+import Data.Semigroup
 
 infixr 0 <?>
 
@@ -62,6 +63,9 @@
 -- | A named production (used for reporting expected things).
 (<?>) :: Prod r e t a -> e -> Prod r e t a
 (<?>) = Named
+
+instance Semigroup (Prod r e t a) where
+  (<>) = (<|>)
 
 instance Monoid (Prod r e t a) where
   mempty  = empty
diff --git a/Text/Earley/Parser/Internal.hs b/Text/Earley/Parser/Internal.hs
--- a/Text/Earley/Parser/Internal.hs
+++ b/Text/Earley/Parser/Internal.hs
@@ -13,6 +13,7 @@
 #if !MIN_VERSION_base(4,8,0)
 import Data.Monoid
 #endif
+import Data.Semigroup
 
 -------------------------------------------------------------------------------
 -- * Concrete rules and productions
@@ -86,6 +87,9 @@
   Results stxs >>= f = Results $ do
     xs <- stxs
     concat <$> mapM (unResults . f) xs
+
+instance Semigroup (Results s a) where
+  (<>) = (<|>)
 
 instance Monoid (Results s a) where
   mempty = empty
