diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+#### 0.1.2.0 *2018-03-15*
+
+* Fix compatibility with base-4.11/GHC 8.4
+
 #### 0.1.1.0 *2016-01-25*
 
 * Introduce the `adler32Update'` method to the `Adler32Src` class.
diff --git a/adler32.cabal b/adler32.cabal
--- a/adler32.cabal
+++ b/adler32.cabal
@@ -1,17 +1,17 @@
 name:                adler32
-version:             0.1.1.0
+version:             0.1.2.0
 synopsis:            An implementation of Adler-32, supporting rolling checksum operation
 description:
   This package provides an implementation of the Adler-32 checksum algorithm.
-  In supports a rolling checksum mode, i.e. the checksum of a sliding window
+  It supports a rolling checksum mode, i.e. the checksum of a sliding window
   of the input message can be computed efficiently. It also supports
   compounding, i.e. the checksum of the concatenation of two messages can be
   efficiently computed from the checksums of the two parts.
   .
   By default, the highly optimized implementation of Adler-32 from @zlib@
-  will be used. This can be disabled in which case a pure haskell
-  implementation will be used instead. The haskell version is 2 to 3 times
-  slower on my system.
+  will be used. This can be disabled, in which case a pure haskell
+  implementation will be used instead. On my system, the haskell version
+  is 2 to 3 times slower.
 homepage:            https://github.com/redneb/hs-adler32
 bug-reports:         https://github.com/redneb/hs-adler32/issues
 license:             BSD3
@@ -36,7 +36,7 @@
 library
   exposed-modules:     Data.Digest.Adler32
   -- other-modules:       
-  build-depends:         base >=4.6 && <5
+  build-depends:         base >=4.9 && <5
                        , bytestring >=0.10.2
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/src/Data/Digest/Adler32.hs b/src/Data/Digest/Adler32.hs
--- a/src/Data/Digest/Adler32.hs
+++ b/src/Data/Digest/Adler32.hs
@@ -37,10 +37,7 @@
 import qualified Data.ByteString.Lazy as BL
 import Data.Word (Word8, Word32)
 import Data.Bits (unsafeShiftL, unsafeShiftR, (.|.), (.&.))
-import Data.Monoid ((<>))
-#if !MIN_VERSION_base(4,8,0)
-import Data.Monoid (Monoid(..))
-#endif
+import Data.Semigroup (Semigroup(..))
 
 #ifdef USE_ZLIB
 import qualified Foreign as F
@@ -67,7 +64,7 @@
     adler32' = adler32Update' mempty
     {-# INLINE adler32' #-}
 
-    -- | Similar to 'adler32' except that it operates on 'Adler32' values.
+    -- | Similar to 'adler32update' except that it operates on 'Adler32' values.
     -- An 'Adler32' value can also be updated with 'adler32'' in conjunction
     -- with the @Monoid@ instance of that type.
     adler32Update' :: Adler32 -> a -> Adler32
@@ -137,16 +134,22 @@
 instance Adler32Src BL.ByteString where
     adler32Update' = BL.foldlChunks (\c s -> c <> adler32' s)
 
+instance Semigroup Adler32 where
+    Adler32 a1 b1 l1 <> Adler32 a2 b2 l2 =
+        Adler32 (mod0 $ a1m1 + a2) b (mod0 $ l1 + l2)
+      where
+        b = mod1 $ b1 + b2 + l2 * a1m1
+        a1m1 = if a1 == 0 then base - 1 else a1 - 1
+
 -- | 'mempty' is the checksum of the empty message and '<>' computes the
 -- checksum of the concatenation of two messages. '<>' is an /O(1)/
 -- operation.
 instance Monoid Adler32 where
     mempty = Adler32 1 0 0
-    mappend (Adler32 a1 b1 l1) (Adler32 a2 b2 l2) =
-        Adler32 (mod0 $ a1m1 + a2) b (mod0 $ l1 + l2)
-      where
-        b = mod1 $ b1 + b2 + l2 * a1m1
-        a1m1 = if a1 == 0 then base - 1 else a1 - 1
+
+#if !(MIN_VERSION_base(4,11,0))
+    mappend = (<>)
+#endif
 
 -- | /O(1)/. If @c@ is the checksum of a message that starts with the
 -- byte @d1@ then @adler32SlideL d1 c d2@ is the checksum of the message
