diff --git a/Control/Category/Constrained.hs b/Control/Category/Constrained.hs
--- a/Control/Category/Constrained.hs
+++ b/Control/Category/Constrained.hs
@@ -35,6 +35,7 @@
             -- * Constraining a category
           , ConstrainedCategory (ConstrainedMorphism)
           , constrained, unconstrained
+          , ConstrainedFunction
             -- * Global-element proxies
           , HasAgent (..)
           , genericAlg, genericAgentMap
@@ -118,6 +119,8 @@
   type Object (ConstrainedCategory k isObj) o = (Object k o, isObj o)
   id = ConstrainedMorphism id
   ConstrainedMorphism f . ConstrainedMorphism g = ConstrainedMorphism $ f . g
+
+type ConstrainedFunction isObj = ConstrainedCategory (->) isObj
 
 
 -- | Apart from /the/ identity morphism, 'id', there are other morphisms that
diff --git a/Data/Foldable/Constrained.hs b/Data/Foldable/Constrained.hs
--- a/Data/Foldable/Constrained.hs
+++ b/Data/Foldable/Constrained.hs
@@ -38,7 +38,9 @@
    , mapM_, sequence_, concatMap
    , Foldable(..)
    )
-import Data.Monoid
+
+import Data.Semigroup
+import Data.Monoid hiding ((<>))
 import qualified Data.List as List
 
 import qualified Control.Category.Hask as Hask
@@ -69,25 +71,32 @@
   -- @
   -- 'foldMap' &#x2261; 'Hask.foldMap'
   -- @
-  foldMap :: ( Object k a, Object l (t a), Monoid m, Object k m, Object l m )
+  foldMap :: ( Object k a, Object l (t a), Semigroup m, Monoid m, Object k m, Object l m )
                => (a `k` m) -> t a `l` m
 
-fold :: (Foldable t k k, Monoid m, Object k m, Object k (t m)) => t m `k` m
+fold :: (Foldable t k k, Monoid m, Semigroup m, Object k m, Object k (t m)) => t m `k` m
 fold = foldMap id
 
 newtype Endo' k a = Endo' { runEndo' :: k a a }
+instance (Category k, Object k a) => Semigroup (Endo' k a) where
+  (Endo' f) <> (Endo' g) = Endo' $ f . g
 instance (Category k, Object k a) => Monoid (Endo' k a) where
   mempty = Endo' id
-  mappend (Endo' f) (Endo' g) = Endo' $ f . g
+  mappend = (<>)
 
 newtype Monoidal_ (r :: * -> * -> *) (s :: * -> * -> *) (f :: * -> *) (u :: *) 
       = Monoidal { runMonoidal :: f u }
 instance ( Monoidal f k k, Function k
-         , u ~ UnitObject k, Monoid u 
+         , u ~ UnitObject k, Semigroup u, Monoid u 
          , ObjectPair k u u, ObjectPair k (f u) (f u), Object k (f u,f u)
+         ) => Semigroup (Monoidal_ k k f u) where
+  (<>) = mappendMdl
+instance ( Monoidal f k k, Function k
+         , u ~ UnitObject k, Semigroup u, Monoid u 
+         , ObjectPair k u u, ObjectPair k (f u) (f u), Object k (f u,f u)
          ) => Monoid (Monoidal_ k k f u) where
   mempty = memptyMdl
-  mappend = mappendMdl
+  mappend = (<>)
 
 memptyMdl :: forall r s f u v . ( Monoidal f r s, Function s
                                 , ObjectPair s u u, Monoid v
diff --git a/constrained-categories.cabal b/constrained-categories.cabal
--- a/constrained-categories.cabal
+++ b/constrained-categories.cabal
@@ -1,5 +1,5 @@
 Name:                constrained-categories
-Version:             0.3.1.0
+Version:             0.3.1.1
 Category:            control
 Synopsis:            Constrained clones of the category-theory type classes, using ConstraintKinds.
 Description:         Haskell has, and makes great use of, powerful facilities from category
@@ -31,7 +31,7 @@
 Homepage:            https://github.com/leftaroundabout/constrained-categories
 Build-Type:          Simple
 Cabal-Version:       >=1.10
-Tested-With:         GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.2
+Tested-With:         GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.2,  GHC == 8.2.1
                                 
 
 source-repository head
@@ -43,6 +43,7 @@
   Build-Depends:      base>=4.7 && <5
                       , tagged
                       , void
+                      , semigroups
   Default-Extensions: ConstraintKinds
                       TypeFamilies
                       FlexibleInstances
