diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+* 0.3.1: 20 August 2013
+
+  - new module Data.Monoid.Endomorphism
+  - add derived Functor, Foldable, and Traversable instances for Data.Monoid.Inf.Inf
+
 * 0.3: 2 May 2013
 
   - generalize PosInf to Inf, which supports making monoids out of
diff --git a/monoid-extras.cabal b/monoid-extras.cabal
--- a/monoid-extras.cabal
+++ b/monoid-extras.cabal
@@ -1,5 +1,5 @@
 name:                monoid-extras
-version:             0.3.0.0
+version:             0.3.1.0
 synopsis:            Various extra monoid-related definitions and utilities
 description:         Various extra monoid-related definitions and utilities,
                      such as monoid actions, monoid coproducts, \"deletable\"
@@ -24,6 +24,7 @@
                      Data.Monoid.Coproduct,
                      Data.Monoid.Cut,
                      Data.Monoid.Deletable,
+                     Data.Monoid.Endomorphism,
                      Data.Monoid.Inf,
                      Data.Monoid.MList,
                      Data.Monoid.Recommend,
@@ -31,7 +32,8 @@
                      Data.Monoid.WithSemigroup
 
   build-depends:     base >= 4.3 && < 4.8,
-                     semigroups >= 0.8 && < 0.10
+                     semigroups >= 0.8 && < 0.10,
+                     semigroupoids < 4
 
   hs-source-dirs:    src
 
diff --git a/src/Data/Monoid/Endomorphism.hs b/src/Data/Monoid/Endomorphism.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Monoid/Endomorphism.hs
@@ -0,0 +1,33 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Data.Monoid.Endomorphism
+-- Copyright   :  (c) 2013 diagrams-core team (see LICENSE)
+-- License     :  BSD-style (see LICENSE)
+-- Maintainer  :  diagrams-discuss@googlegroups.com
+--
+-- The monoid of endomorphisms over any 'Category'.
+--
+-----------------------------------------------------------------------------
+
+module Data.Monoid.Endomorphism
+    ( Endomorphism(..)
+    )
+    where
+
+import           Control.Category
+import           Data.Semigroup
+import           Data.Semigroupoid
+import           Prelude           hiding (id, (.))
+
+-- | An 'Endomorphism' in a given 'Category' is a morphism from some
+--   object to itself.  The set of endomorphisms for a particular
+--   object form a monoid, with composition as the combining operation
+--   and the identity morphism as the identity element.
+newtype Endomorphism k a = Endomorphism {getEndomorphism :: k a a}
+
+instance Semigroupoid k => Semigroup (Endomorphism k a) where
+  Endomorphism a <> Endomorphism b = Endomorphism (a `o` b)
+
+instance Category k => Monoid (Endomorphism k a) where
+  mempty = Endomorphism id
+  Endomorphism a `mappend` Endomorphism b = Endomorphism (a . b)
diff --git a/src/Data/Monoid/Inf.hs b/src/Data/Monoid/Inf.hs
--- a/src/Data/Monoid/Inf.hs
+++ b/src/Data/Monoid/Inf.hs
@@ -1,3 +1,7 @@
+{-# LANGUAGE DeriveFoldable    #-}
+{-# LANGUAGE DeriveFunctor     #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE EmptyDataDecls    #-}
 {-# LANGUAGE FlexibleInstances #-}
 -----------------------------------------------------------------------------
 -- |
@@ -24,14 +28,17 @@
        ) where
 
 import           Data.Semigroup
-import qualified Prelude as P
-import           Prelude hiding (minimum, maximum)
+import           Prelude          hiding (maximum, minimum)
+import qualified Prelude          as P
 
+import           Data.Foldable    (Foldable)
+import           Data.Traversable (Traversable)
+
 data Pos
 data Neg
 
 data Inf p a = Infinity | Finite a
-  deriving (Eq, Show, Read)
+  deriving (Eq, Show, Read, Functor, Foldable, Traversable)
 
 type PosInf a = Inf Pos a
 type NegInf a = Inf Neg a
