diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,9 @@
 # Changelog for Hedis
 
+## 0.10.1
+
+* PR #104. Add a Semigroup instance (fix GHC 8.4)
+
 ## 0.10.0
 
 * PR #102. Return list from srandmemberN
diff --git a/hedis.cabal b/hedis.cabal
--- a/hedis.cabal
+++ b/hedis.cabal
@@ -1,5 +1,5 @@
 name:               hedis
-version:            0.10.0
+version:            0.10.1
 synopsis:
     Client library for the Redis datastore: supports full command set,
     pipelining.
@@ -12,9 +12,9 @@
     .
     [Compatibility with Latest Stable Redis:] Hedis is intended
         to be used with the latest stable version of Redis (currently 3.2).
-	Most redis commands (<http://redis.io/commands>) are available as
-	haskell functions, although MONITOR and SYNC are intentionally
-	omitted. Additionally, a low-level API is
+    Most redis commands (<http://redis.io/commands>) are available as
+    haskell functions, although MONITOR and SYNC are intentionally
+    omitted. Additionally, a low-level API is
         exposed that  makes it easy for the library user to implement further
         commands, such as new commands from an experimental Redis version.
     .
@@ -82,6 +82,9 @@
                     HTTP,
                     errors,
                     network-uri
+  if !impl(ghc >= 8.0)
+    build-depends:
+      semigroups >= 0.11 && < 0.19
 
   other-modules:    Database.Redis.Core,
                     Database.Redis.ProtocolPipelining,
diff --git a/src/Database/Redis/PubSub.hs b/src/Database/Redis/PubSub.hs
--- a/src/Database/Redis/PubSub.hs
+++ b/src/Database/Redis/PubSub.hs
@@ -22,7 +22,7 @@
 
 #if __GLASGOW_HASKELL__ < 710
 import Control.Applicative
-import Data.Monoid
+import Data.Monoid hiding (<>)
 #endif
 import Control.Concurrent.Async (withAsync, waitEitherCatch, waitEitherCatchSTM)
 import Control.Concurrent.STM
@@ -33,6 +33,7 @@
 import Data.List (foldl')
 import Data.Maybe (isJust)
 import Data.Pool
+import Data.Semigroup (Semigroup(..))
 import qualified Data.HashMap.Strict as HM
 import qualified Database.Redis.Core as Core
 import qualified Database.Redis.ProtocolPipelining as PP
@@ -66,31 +67,39 @@
     , punsubs :: Cmd Unsubscribe Pattern
     } deriving (Eq)
 
-instance Monoid PubSub where
-    mempty        = PubSub mempty mempty mempty mempty
-    mappend p1 p2 = PubSub { subs    = subs p1 `mappend` subs p2
+instance Semigroup PubSub where
+    (<>) p1 p2 = PubSub { subs    = subs p1 `mappend` subs p2
                            , unsubs  = unsubs p1 `mappend` unsubs p2
                            , psubs   = psubs p1 `mappend` psubs p2
                            , punsubs = punsubs p1 `mappend` punsubs p2
                            }
 
+instance Monoid PubSub where
+    mempty        = PubSub mempty mempty mempty mempty
+    mappend = (<>)
+
 data Cmd a b = DoNothing | Cmd { changes :: [ByteString] } deriving (Eq)
 
+instance Semigroup (Cmd Subscribe a) where
+  (<>) DoNothing x = x
+  (<>) x DoNothing = x
+  (<>) (Cmd xs) (Cmd ys) = Cmd (xs ++ ys)
+
 instance Monoid (Cmd Subscribe a) where
-    mempty                      = DoNothing
-    mappend DoNothing x         = x
-    mappend x         DoNothing = x
-    mappend (Cmd xs)  (Cmd ys)  = Cmd (xs ++ ys)
+  mempty = DoNothing
+  mappend = (<>)
     
-instance Monoid (Cmd Unsubscribe a) where
-    mempty                       = DoNothing
-    mappend DoNothing x          = x
-    mappend x         DoNothing  = x
-    -- empty subscription list => unsubscribe all channels and patterns
-    mappend (Cmd [])  _          = Cmd []
-    mappend _         (Cmd [])   = Cmd []
-    mappend (Cmd xs)  (Cmd ys)   = Cmd (xs ++ ys)
+instance Semigroup (Cmd Unsubscribe a) where
+  (<>) DoNothing x = x
+  (<>) x DoNothing = x
+  -- empty subscription list => unsubscribe all channels and patterns
+  (<>) (Cmd []) _ = Cmd []
+  (<>) _ (Cmd []) = Cmd []
+  (<>) (Cmd xs) (Cmd ys) = Cmd (xs ++ ys)
 
+instance Monoid (Cmd Unsubscribe a) where
+  mempty = DoNothing
+  mappend = (<>)
 
 class Command a where
     redisCmd      :: a -> ByteString
