diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for yaml-combinators
 
+## 1.1.1.1
+
+Make compatible with GHC 8.4 and drop support for GHC 7.x
+
 ## 1.1.1
 
 Add `anyValue`, which parses any JSON value
diff --git a/src/Data/Yaml/Combinators.hs b/src/Data/Yaml/Combinators.hs
--- a/src/Data/Yaml/Combinators.hs
+++ b/src/Data/Yaml/Combinators.hs
@@ -43,7 +43,7 @@
 import Data.List
 import Data.Maybe
 import Data.ByteString (ByteString)
-import Data.Monoid ((<>))
+import Data.Semigroup (Semigroup((<>)))
 import qualified Data.ByteString.Char8 as BS8
 import Data.Bifunctor (first)
 import Control.Monad.Trans.Reader
@@ -62,7 +62,7 @@
 
 -- $setup
 -- >>> :set -XOverloadedStrings -XTypeApplications
--- >>> import Data.Monoid
+-- >>> import Data.Semigroup
 
 -- orphan Value instances
 deriveGeneric ''Value
@@ -193,8 +193,8 @@
 --
 -- * Construct a 'Parser' with 'string', 'number', 'integer', 'bool', 'array', or 'object'.
 --
--- * Combine two or more 'Parser's with 'Monoid' operators
--- such as 'mappend', 'Data.Monoid.<>', or `mconcat` —
+-- * Combine two or more 'Parser's with 'Monoid' or 'Semigroup' operators
+-- such as 'mappend', '<>', or `mconcat` —
 -- e.g. if you expect either an object or a string.
 --
 -- * Run with 'parse' or 'runParser'.
@@ -207,9 +207,8 @@
 instance Functor Parser where
   fmap f (Parser comps) = Parser $ hliftA (pcFmap f) comps
 
-instance Monoid (ParserComponent a fs) where
-  mempty = ParserComponent Nothing
-  ParserComponent mbP1 `mappend` ParserComponent mbP2 =
+instance Semigroup (ParserComponent a fs) where
+  ParserComponent mbP1 <> ParserComponent mbP2 =
     ParserComponent $ case (mbP1, mbP2) of
       (Nothing, Nothing) -> Nothing
       (Just p1, Nothing) -> Just p1
@@ -220,9 +219,16 @@
           (_, Right r2) -> Right r2
           (Left l1, Left l2) -> Left $ mergeParseError l1 l2
 
+instance Monoid (ParserComponent a fs) where
+  mempty = ParserComponent Nothing
+  mappend = (<>)
+
+instance Semigroup (Parser a) where
+  Parser rec1 <> Parser rec2 = Parser $ hliftA2 mappend rec1 rec2
+
 instance Monoid (Parser a) where
   mempty = Parser $ hpure mempty
-  Parser rec1 `mappend` Parser rec2 = Parser $ hliftA2 mappend rec1 rec2
+  mappend = (<>)
 
 -- | A low-level function to run a 'Parser'.
 runParser :: Parser a -> Value -> Either ParseError a
diff --git a/yaml-combinators.cabal b/yaml-combinators.cabal
--- a/yaml-combinators.cabal
+++ b/yaml-combinators.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                yaml-combinators
-version:             1.1.1
+version:             1.1.1.1
 synopsis:            YAML parsing combinators for improved validation and error reporting
 description:         Based on the article
                      <https://ro-che.info/articles/2015-07-26-better-yaml-parsing Better Yaml Parsing>.
@@ -31,7 +31,7 @@
   -- other-extensions:
   build-depends:
     aeson,
-    base >= 4.8 && < 5,
+    base >= 4.9 && < 5,
     bytestring,
     generics-sop >= 0.2.5,
     scientific,
@@ -41,7 +41,6 @@
     vector,
     yaml
   hs-source-dirs:      src
-  default-language:    Haskell2010
   ghc-options: -Wall -fno-warn-orphans
 
 test-suite test
