diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Change log
 
+## 0.3.1.0
+
+* Add `Semigroup` instance for `SeriesElem`
+
 ## 0.3.0.2
 
 * Backwards compatibility down to GHC 8.4 (@pbrisbin)
diff --git a/library/Control/Monad/Logger/Aeson/Internal.hs b/library/Control/Monad/Logger/Aeson/Internal.hs
--- a/library/Control/Monad/Logger/Aeson/Internal.hs
+++ b/library/Control/Monad/Logger/Aeson/Internal.hs
@@ -6,6 +6,7 @@
 {-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE StandaloneDeriving #-}
 {-# LANGUAGE StrictData #-}
 module Control.Monad.Logger.Aeson.Internal
   ( -- * Disclaimer
@@ -107,15 +108,25 @@
 keyMapUnion = AesonCompat.union
 
 -- | A single key-value pair, where the value is encoded JSON. This is a more
--- restricted version of 'Series': a 'SeriesElem' encapsulates exactly one
--- key-value pair, whereas a 'Series' encapsulates zero or more key-value pairs.
+-- restricted version of 'Series': a 'SeriesElem' is intended to encapsulate
+-- exactly one key-value pair, whereas a 'Series' encapsulates zero or more
+-- key-value pairs. 'SeriesElem' values can be created via '(.=)' from @aeson@.
 --
--- Values of this type are only created via '(.=)' from @aeson@.
+-- While a 'SeriesElem' most often will map to a single pair, note that a
+-- 'Semigroup' instance is available for performance's sake. The 'Semigroup'
+-- instance is useful when multiple pairs are grouped together and then shared
+-- across multiple logging calls. In that case, the cost of combining the pairs
+-- in the group must only be paid once.
 --
 -- @since 0.3.0.0
 newtype SeriesElem = UnsafeSeriesElem
   { unSeriesElem :: Series
-  } deriving newtype KeyValue
+  }
+
+-- | @since 0.3.0.0
+deriving newtype instance KeyValue SeriesElem
+-- | @since 0.3.1.0
+deriving newtype instance Semigroup SeriesElem
 
 -- | This type is the Haskell representation of each JSON log message produced
 -- by this library.
diff --git a/monad-logger-aeson.cabal b/monad-logger-aeson.cabal
--- a/monad-logger-aeson.cabal
+++ b/monad-logger-aeson.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           monad-logger-aeson
-version:        0.3.0.2
+version:        0.3.1.0
 synopsis:       JSON logging using monad-logger interface
 description:    @monad-logger-aeson@ provides structured JSON logging using @monad-logger@'s
                 interface.
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: monad-logger-aeson
-version: '0.3.0.2'
+version: '0.3.1.0'
 github: "jship/monad-logger-aeson"
 license: MIT
 license-file: LICENSE.md
