diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+* 0.2.2.0: 10 December 2012
+
+  - Add new module Data.Monoid.Recommend
+
 * 0.2.1.0: 28 September 2012
 
   - Add new module Data.Monoid.Cut
diff --git a/monoid-extras.cabal b/monoid-extras.cabal
--- a/monoid-extras.cabal
+++ b/monoid-extras.cabal
@@ -1,9 +1,9 @@
 name:                monoid-extras
-version:             0.2.1.0
+version:             0.2.2.0
 synopsis:            Various extra monoid-related definitions and utilities
 description:         Various extra monoid-related definitions and utilities,
-                     such as monoid actions, monoid coproducts, "deletable"
-                     monoids, "split" monoids, and "cut" monoids.
+                     such as monoid actions, monoid coproducts, \"deletable\"
+                     monoids, \"split\" monoids, and \"cut\" monoids.
 license:             BSD3
 license-file:        LICENSE
 extra-source-files:  CHANGES
@@ -26,6 +26,7 @@
                      Data.Monoid.Deletable,
                      Data.Monoid.MList,
                      Data.Monoid.PosInf,
+                     Data.Monoid.Recommend,
                      Data.Monoid.Split,
                      Data.Monoid.WithSemigroup
 
diff --git a/src/Data/Monoid/Recommend.hs b/src/Data/Monoid/Recommend.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Monoid/Recommend.hs
@@ -0,0 +1,49 @@
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Data.Monoid.Recommend
+-- Copyright   :  (c) 2012 diagrams-core team (see LICENSE)
+-- License     :  BSD-style (see LICENSE)
+-- Maintainer  :  diagrams-discuss@googlegroups.com
+--
+-- A type for representing values with an additional bit saying
+-- whether the value is \"just a recommendation\" (to be used only if
+-- nothing better comes along) or a \"committment\" (to certainly be
+-- used, overriding merely recommended values), along with
+-- corresponding @Semigroup@ and @Monoid@ instances.
+--
+-----------------------------------------------------------------------------
+
+module Data.Monoid.Recommend
+       ( Recommend(..), getRecommend
+       ) where
+
+import Data.Semigroup
+
+-- | A value of type @Recommend a@ consists of a value of type @a@
+--   wrapped up in one of two constructors.  The @Recommend@
+--   constructor indicates a \"non-committal recommendation\"---that
+--   is, the given value should be used if no other/better values are
+--   available.  The @Commit@ constructor indicates a
+--   \"commitment\"---a value which should definitely be used,
+--   overriding any @Recommend@ed values.
+data Recommend a = Recommend a
+                 | Commit a
+
+-- | Extract the value of type @a@ wrapped in @Recommend a@.
+getRecommend :: Recommend a -> a
+getRecommend (Recommend a) = a
+getRecommend (Commit a)    = a
+
+-- | 'Commit' overrides 'Recommend'. Two values wrapped in the same
+--   constructor (both 'Recommend' or both 'Commit') are combined
+--   according to the underlying @Semigroup@ instance.
+instance Semigroup a => Semigroup (Recommend a) where
+  Recommend a <> Recommend b = Recommend (a <> b)
+  Recommend _ <> Commit b    = Commit b
+  Commit a    <> Recommend _ = Commit a
+  Commit a    <> Commit b    = Commit (a <> b)
+
+instance (Semigroup a, Monoid a) => Monoid (Recommend a) where
+  mappend = (<>)
+  mempty  = Recommend mempty
