diff --git a/Text/ProtocolBuffers/Basic.hs b/Text/ProtocolBuffers/Basic.hs
--- a/Text/ProtocolBuffers/Basic.hs
+++ b/Text/ProtocolBuffers/Basic.hs
@@ -19,6 +19,7 @@
 import Data.Generics(Data(..))
 import Data.Int(Int32,Int64)
 import Data.Ix(Ix)
+import Data.Semigroup (Semigroup(..))
 #if __GLASGOW_HASKELL__ < 710
 import Data.Monoid(Monoid(..))
 #endif
@@ -51,9 +52,12 @@
                               s = showsPrec
                           in s d (U.toString bs)
 
+instance Semigroup Utf8 where
+  (<>) (Utf8 x) (Utf8 y) = Utf8 (x <> y)
+
 instance Monoid Utf8 where
   mempty = Utf8 mempty
-  mappend (Utf8 x) (Utf8 y) = Utf8 (mappend x y)
+  mappend = (<>)
 
 -- | 'WireTag' is the 32 bit value with the upper 29 bits being the
 -- 'FieldId' and the lower 3 bits being the 'WireType'
diff --git a/protocol-buffers.cabal b/protocol-buffers.cabal
--- a/protocol-buffers.cabal
+++ b/protocol-buffers.cabal
@@ -1,5 +1,5 @@
 name:           protocol-buffers
-version:        2.4.6
+version:        2.4.7
 cabal-version:  >= 1.6
 build-type:     Simple
 license:        BSD3
@@ -44,6 +44,9 @@
                  parsec,
                  utf8-string,
                  syb
+  if !impl(ghc >= 8.0)
+    build-depends:
+      semigroups >= 0.11 && < 0.19
 
 -- Most of these are needed for protocol-buffers (Get and WireMessage.hs)
 -- Nothing especially hazardous in this list
