diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,16 @@
 Changelog
 =========
 
+2.1.0.2
+-------
+
+Fix compatibility with GHC 8.4 and drop support for GHC 7.x
+
+2.1.0.1
+-------
+
+Fix a link in the README
+
 2.1
 ---
 
diff --git a/lexer-applicative.cabal b/lexer-applicative.cabal
--- a/lexer-applicative.cabal
+++ b/lexer-applicative.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                lexer-applicative
-version:             2.1.0.1
+version:             2.1.0.2
 synopsis:            Simple lexer based on applicative regular expressions
 description:         Simple lexer based on applicative regular expressions
 homepage:            https://github.com/feuerbach/lexer-applicative
@@ -28,7 +28,7 @@
   -- other-modules:       
   -- other-extensions:    
   build-depends:
-    base >=4.5 && < 5,
+    base >=4.9 && < 5,
     srcloc >= 0.5,
     regex-applicative >= 0.3.1
   hs-source-dirs:      src
diff --git a/src/Language/Lexer/Applicative.hs b/src/Language/Lexer/Applicative.hs
--- a/src/Language/Lexer/Applicative.hs
+++ b/src/Language/Lexer/Applicative.hs
@@ -24,7 +24,7 @@
 import Data.Loc
 import Data.List
 import Data.Typeable (Typeable)
-import Data.Monoid
+import Data.Semigroup (Semigroup(..))
 import Data.Function
 import Control.Exception
 
@@ -52,9 +52,12 @@
   }
   deriving Functor
 
+instance Semigroup (Lexer tok) where
+  Lexer t1 w1 <> Lexer t2 w2 = Lexer (t1 <> t2) (w1 <> w2)
+
 instance Monoid (Lexer tok) where
   mempty = Lexer mempty mempty
-  Lexer t1 w1 `mappend` Lexer t2 w2 = Lexer (t1 <> t2) (w1 <> w2)
+  mappend = (<>)
 
 -- | Build a lexer with the given token recognizer and no (i.e. 'mempty')
 -- whitespace recognizer.
@@ -89,9 +92,12 @@
 newtype Recognizer tok = Recognizer (RE Char (RE Char tok))
   deriving Functor
 
+instance Semigroup (Recognizer tok) where
+  Recognizer r1 <> Recognizer r2 = Recognizer (r1 <|> r2)
+
 instance Monoid (Recognizer tok) where
   mempty = Recognizer empty
-  mappend (Recognizer r1) (Recognizer r2) = Recognizer (r1 <|> r2)
+  mappend = (<>)
 
 -- | When scanning a next token, the regular expression will compete with
 -- the other 'Recognizer's of its 'Lexer'. If it wins, its result
