diff --git a/Data/Universe/Instances/Eq.hs b/Data/Universe/Instances/Eq.hs
deleted file mode 100644
--- a/Data/Universe/Instances/Eq.hs
+++ /dev/null
@@ -1,11 +0,0 @@
-module Data.Universe.Instances.Eq (
-	-- | An 'Eq' instance for functions, given the input is 'Finite' and the
-	-- output is 'Eq'. Compares pointwise.
-	Eq(..)
-	) where
-
-import Data.Monoid
-import Data.Universe.Instances.Base
-
-instance (Finite a, Eq b) => Eq (a -> b) where
-	f == g = and [f x == g x | x <- universeF]
diff --git a/Data/Universe/Instances/Ord.hs b/Data/Universe/Instances/Ord.hs
deleted file mode 100644
--- a/Data/Universe/Instances/Ord.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module Data.Universe.Instances.Ord (
-	-- | An 'Ord' instance for functions, given the input is 'Finite' and the
-	-- output is 'Ord'. Compares pointwise, with higher priority to inputs
-	-- that appear earlier in 'universeF'.
-	Ord(..)
-	) where
-
-import Data.Monoid
-import Data.Universe.Instances.Base
-import Data.Universe.Instances.Eq
-
-instance (Finite a, Ord b) => Ord (a -> b) where
-	f `compare` g = mconcat [f x `compare` g x | x <- universeF]
diff --git a/Data/Universe/Instances/Read.hs b/Data/Universe/Instances/Read.hs
deleted file mode 100644
--- a/Data/Universe/Instances/Read.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module Data.Universe.Instances.Read (
-	-- | A 'Read' instance for functions, given the input is 'Finite' and
-	-- 'Ord' and both the input and output are 'Read'.
-	Read(..)
-	) where
-
-import Data.Map (fromList, (!))
-import Data.Universe.Instances.Base
-
--- actually, the "Finite a" part of the context wouldn't be inferred if you
--- asked GHC -- but it's kind of hopeless otherwise!
-instance (Finite a, Ord a, Read a, Read b) => Read (a -> b) where
-	readsPrec n s = [((fromList v !), s') | (v, s') <- readsPrec n s]
diff --git a/Data/Universe/Instances/Show.hs b/Data/Universe/Instances/Show.hs
deleted file mode 100644
--- a/Data/Universe/Instances/Show.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-module Data.Universe.Instances.Show (
-	-- | A 'Show' instance for functions, given the input is 'Finite' and both
-	-- the input and output are 'Show'.
-	Show(..)
-	) where
-
-import Data.Universe.Instances.Base
-
-instance (Finite a, Show a, Show b) => Show (a -> b) where
-	showsPrec n f = showsPrec n [(a, f a) | a <- universeF]
diff --git a/Data/Universe/Instances/Traversable.hs b/Data/Universe/Instances/Traversable.hs
deleted file mode 100644
--- a/Data/Universe/Instances/Traversable.hs
+++ /dev/null
@@ -1,19 +0,0 @@
-module Data.Universe.Instances.Traversable (
-	-- | A 'Foldable' instance for functions, given the input is 'Finite', and
-	-- a 'Traversable' instance for functions, given the input is 'Ord' and
-	-- 'Finite'.
-	Foldable(..), Traversable(..)
-	) where
-
-import Control.Applicative
-import Data.Foldable
-import Data.Map ((!), fromList)
-import Data.Monoid
-import Data.Traversable
-import Data.Universe.Instances.Base
-
-instance Finite e => Foldable ((->) e) where
-	foldMap f g = mconcat $ map (f . g) universeF
-
-instance (Ord e, Finite e) => Traversable ((->) e) where
-	sequenceA f = (!) . fromList <$> sequenceA [(,) x <$> f x | x <- universeF]
diff --git a/src/Data/Universe/Instances/Eq.hs b/src/Data/Universe/Instances/Eq.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Universe/Instances/Eq.hs
@@ -0,0 +1,14 @@
+module Data.Universe.Instances.Eq (
+  -- | An 'Eq' instance for functions, given the input is 'Finite' and the
+  -- output is 'Eq'. Compares pointwise.
+  Eq(..)
+  ) where
+
+import Data.Monoid
+import Data.Universe.Class
+
+instance (Finite a, Eq b) => Eq (a -> b) where
+  f == g = and [f x == g x | x <- universeF]
+
+instance (Finite a, Eq a) => Eq (Endo a) where
+  Endo f == Endo g = f == g
diff --git a/src/Data/Universe/Instances/Ord.hs b/src/Data/Universe/Instances/Ord.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Universe/Instances/Ord.hs
@@ -0,0 +1,16 @@
+module Data.Universe.Instances.Ord (
+  -- | An 'Ord' instance for functions, given the input is 'Finite' and the
+  -- output is 'Ord'. Compares pointwise, with higher priority to inputs
+  -- that appear earlier in 'universeF'.
+  Ord(..)
+  ) where
+
+import qualified Data.Monoid as Mon
+import Data.Universe.Class (Finite (..))
+import Data.Universe.Instances.Eq
+
+instance (Finite a, Ord b) => Ord (a -> b) where
+  f `compare` g = Mon.mconcat [f x `compare` g x | x <- universeF]
+
+instance (Finite a, Ord a) => Ord (Mon.Endo a) where
+  compare (Mon.Endo f) (Mon.Endo g) = compare f g
diff --git a/src/Data/Universe/Instances/Read.hs b/src/Data/Universe/Instances/Read.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Universe/Instances/Read.hs
@@ -0,0 +1,24 @@
+-- | A 'Read' instance for functions, given the input is 'Finite' and
+-- 'Ord' and both the input and output are 'Read'.
+module Data.Universe.Instances.Read () where
+
+import Data.Universe.Class (Finite (..))
+
+import qualified Data.Map as Map
+import qualified Data.Set as Set
+import qualified Data.Monoid as Mon
+
+instance (Finite a, Ord a, Read a, Read b) => Read (a -> b) where
+  readsPrec n s =
+    [ ((m Map.!), s')
+    | (v, s') <- readsPrec n s
+    , let m = Map.fromList v
+    , Map.keysSet m == Set.fromList universeF
+    ]
+
+instance (Finite a, Ord a, Read a) => Read (Mon.Endo a) where
+  readsPrec d = readParen (d > 10) $ \s0 ->
+    [ (Mon.Endo f, s2)
+    | ("Endo", s1) <- lex s0
+    , (f, s2) <- readsPrec 11 s1
+    ]
diff --git a/src/Data/Universe/Instances/Show.hs b/src/Data/Universe/Instances/Show.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Universe/Instances/Show.hs
@@ -0,0 +1,14 @@
+-- | A 'Show' instance for functions, given the input is 'Finite' and both
+-- the input and output are 'Show'.
+module Data.Universe.Instances.Show () where
+
+import Data.Universe.Class (Universe (..), Finite (..))
+import qualified Data.Monoid as Mon
+
+instance (Finite a, Show a, Show b) => Show (a -> b) where
+  showsPrec n f = showsPrec n [(a, f a) | a <- universeF]
+
+instance (Finite a, Show a) => Show (Mon.Endo a) where
+  showsPrec d (Mon.Endo f) = showParen (d > 10)
+    $ showString "Endo "
+    . showsPrec 11 f
diff --git a/src/Data/Universe/Instances/Traversable.hs b/src/Data/Universe/Instances/Traversable.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Universe/Instances/Traversable.hs
@@ -0,0 +1,17 @@
+-- | A 'Foldable' instance for functions, given the input is 'Finite', and
+-- a 'Traversable' instance for functions, given the input is 'Ord' and
+-- 'Finite'.
+module Data.Universe.Instances.Traversable () where
+
+import Control.Applicative
+import Data.Foldable
+import Data.Map ((!), fromList)
+import Data.Monoid
+import Data.Traversable
+import Data.Universe.Class
+
+instance Finite e => Foldable ((->) e) where
+  foldMap f g = mconcat $ map (f . g) universeF
+
+instance (Ord e, Finite e) => Traversable ((->) e) where
+  sequenceA f = (!) . fromList <$> sequenceA [(,) x <$> f x | x <- universeF]
diff --git a/universe-reverse-instances.cabal b/universe-reverse-instances.cabal
--- a/universe-reverse-instances.cabal
+++ b/universe-reverse-instances.cabal
@@ -1,30 +1,48 @@
-name:                universe-reverse-instances
-version:             1.0
-synopsis:            instances of standard classes that are made possible by enumerations
-homepage:            https://github.com/dmwit/universe
-license:             BSD3
-license-file:        LICENSE
-author:              Daniel Wagner
-maintainer:          me@dmwit.com
-copyright:           Daniel Wagner 2014
-category:            Data
-build-type:          Simple
-cabal-version:       >=1.10
+name:          universe-reverse-instances
+version:       1.1
+synopsis:
+  Instances of standard classes that are made possible by enumerations
+
+description:
+  For example this package provides a @Eq (a -> b)@ instance:
+  .
+  @
+  instance (Finite a, Eq b) => Eq (a -> b) where
+  f == g = and [f x == g x | x <- universeF]
+  @
+
+homepage:      https://github.com/dmwit/universe
+license:       BSD3
+license-file:  LICENSE
+author:        Daniel Wagner
+maintainer:    me@dmwit.com
+copyright:     Daniel Wagner 2014
+category:      Data
+build-type:    Simple
+cabal-version: >=1.10
+tested-with:
+  GHC ==8.8.1 || ==8.6.4 || ==8.4.4 || ==8.2.2 || ==8.0.2 || ==7.10.3 || ==7.8.4 || ==7.6.3 || ==7.4.2 || ==7.0.4
+
 source-repository head
-    type:            git
-    location:        https://github.com/dmwit/universe
+  type:     git
+  location: https://github.com/dmwit/universe
+
 source-repository this
-    type:            git
-    location:        https://github.com/dmwit/universe
-    tag:             1.0
+  type:     git
+  location: https://github.com/dmwit/universe
+  tag:      1.1
 
 library
-  exposed-modules:     Data.Universe.Instances.Eq,
-                       Data.Universe.Instances.Ord,
-                       Data.Universe.Instances.Read,
-                       Data.Universe.Instances.Show,
-                       Data.Universe.Instances.Traversable
-  build-depends:       base                    >=4   && <5  ,
-                       containers              >=0.5 && <0.6,
-                       universe-instances-base >=1.0 && <1.1
-  default-language:    Haskell2010
+  default-language: Haskell2010
+  hs-source-dirs:   src
+  exposed-modules:
+    Data.Universe.Instances.Eq
+    Data.Universe.Instances.Ord
+    Data.Universe.Instances.Read
+    Data.Universe.Instances.Show
+    Data.Universe.Instances.Traversable
+
+  build-depends:
+      base           >=4.3 && <4.13
+    , containers     >=0.4 && <0.7
+    , universe-base  >=1.1 && <1.1.1
