diff --git a/dynamic-state.cabal b/dynamic-state.cabal
--- a/dynamic-state.cabal
+++ b/dynamic-state.cabal
@@ -1,5 +1,5 @@
 name:                dynamic-state
-version:             0.3
+version:             0.3.1
 synopsis:            Optionally serializable dynamic state keyed by type
 description:         Optionally serializable dynamic state keyed by type
 license:             GPL-2
diff --git a/src/Data/DynamicState.hs b/src/Data/DynamicState.hs
--- a/src/Data/DynamicState.hs
+++ b/src/Data/DynamicState.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE CPP #-}
 {-# OPTIONS_HADDOCK show-extensions #-}
 
 -- |
@@ -25,6 +26,11 @@
 -- | An extensible record, indexed by type
 newtype DynamicState = DynamicState { unDynamicState :: M.HashMap ConcreteTypeRep Dynamic }
   deriving (Typeable)
+
+#if __GLASGOW_HASKELL__ >= 804
+instance Semigroup DynamicState where
+  (<>) = mappend
+#endif
 
 instance Monoid DynamicState where
   mappend (DynamicState a) (DynamicState b) = DynamicState (mappend a b)
diff --git a/src/Data/DynamicState/Serializable.hs b/src/Data/DynamicState/Serializable.hs
--- a/src/Data/DynamicState/Serializable.hs
+++ b/src/Data/DynamicState/Serializable.hs
@@ -54,6 +54,11 @@
 newtype DynamicState = DynamicState { unDynamicState :: M.HashMap ConcreteTypeRep Dynamic }
   deriving (Typeable)
 
+#if __GLASGOW_HASKELL__ >= 804
+instance Semigroup DynamicState where
+  (<>) = mappend
+#endif
+
 instance Monoid DynamicState where
   mappend (DynamicState a) (DynamicState b) = DynamicState (mappend a b)
   mempty = DynamicState mempty
