diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+1.1.2
+
+* Explicitly mark modules as Safe or Trustworthy
+
 1.1.1
 
 * Make Data.Universe.Helpers.cartesianProduct more generative
diff --git a/src/Data/Universe/Class.hs b/src/Data/Universe/Class.hs
--- a/src/Data/Universe/Class.hs
+++ b/src/Data/Universe/Class.hs
@@ -3,6 +3,12 @@
 #ifdef DEFAULT_SIGNATURES
 {-# LANGUAGE DefaultSignatures #-}
 #endif
+{-# LANGUAGE CPP #-}
+#if __GLASGOW_HASKELL__ >=704
+{-# LANGUAGE Safe #-}
+#elif __GLASGOW_HASKELL__ >=702
+{-# LANGUAGE Trustworthy #-}
+#endif
 -- | Bottoms are ignored for this entire module:
 -- only fully-defined inhabitants are considered inhabitants.
 module Data.Universe.Class
@@ -39,6 +45,10 @@
 
 -- $setup
 -- >>> import Data.List
+-- >>> import Data.Universe.Helpers
+--
+-- -- Show (a -> b) instance (in universe-reverse-instances, but cannot depend on it here).
+-- >>> instance (Finite a, Show a, Show b) => Show (a -> b) where showsPrec n f = showsPrec n [(a, f a) | a <- universeF]
 
 -- | Creating an instance of this class is a declaration that your type is
 -- recursively enumerable (and that 'universe' is that enumeration). In
@@ -221,9 +231,16 @@
 --
 -------------------------------------------------------------------------------
 
--- could change the Ord constraint to an Eq one, but come on, how many finite
--- types can't be ordered?
+-- |
+-- >>> mapM_ print (universe :: [Bool -> Bool])
+-- [(False,False),(True,False)]
+-- [(False,False),(True,True)]
+-- [(False,True),(True,False)]
+-- [(False,True),(True,True)]
+--
 instance (Finite a, Ord a, Universe b) => Universe (a -> b) where
+  -- could change the Ord constraint to an Eq one, but come on, how many finite
+  -- types can't be ordered?
   universe = map tableToFunction tables where
     tables          = choices [universe | _ <- monoUniverse]
     tableToFunction = (!) . fromList . zip monoUniverse
@@ -295,6 +312,19 @@
 instance Finite a => Finite (Semi.First a) where universeF = map Semi.First universeF; cardinality = retagWith Semi.First cardinality
 instance Finite a => Finite (Semi.Last  a) where universeF = map Semi.Last  universeF; cardinality = retagWith Semi.Last  cardinality
 
+-- |
+-- >>> mapM_ print (universeF :: [Bool -> Bool])
+-- [(False,False),(True,False)]
+-- [(False,False),(True,True)]
+-- [(False,True),(True,False)]
+-- [(False,True),(True,True)]
+--
+-- >>> cardinality :: Tagged (Bool -> Ordering) Natural
+-- Tagged 9
+--
+-- >>> cardinality :: Tagged (Ordering -> Bool) Natural
+-- Tagged 8
+--
 instance (Ord a, Finite a, Finite b) => Finite (a -> b) where
   universeF = map tableToFunction tables where
     tables          = sequence [universeF | _ <- monoUniverse]
@@ -327,6 +357,14 @@
 -- containers
 -------------------------------------------------------------------------------
 
+-- |
+-- >>> import qualified Data.Set as Set
+-- >>> mapM_ print (universe :: [Set.Set Bool])
+-- fromList []
+-- fromList [False]
+-- fromList [True]
+-- fromList [False,True]
+--
 instance (Ord a, Universe a) => Universe (Set.Set a) where
     universe = Set.empty : go universe
       where
@@ -337,10 +375,23 @@
             inter []     = []
             inter (y:ys) = y : Set.insert x y : inter ys
 
-
 instance (Ord a, Finite a) => Finite (Set.Set a) where
     cardinality = retag (fmap (2 ^) (cardinality :: Tagged a Natural))
 
+-- |
+-- >>> import qualified Data.Map as Map
+-- >>> mapM_ print (universe :: [Map.Map Bool Bool])
+-- fromList []
+-- fromList [(True,False)]
+-- fromList [(False,False)]
+-- fromList [(True,True)]
+-- fromList [(False,False),(True,False)]
+-- fromList [(False,True)]
+-- fromList [(False,False),(True,True)]
+-- fromList [(False,True),(True,False)]
+-- fromList [(False,True),(True,True)]
+--
+--
 instance (Ord k, Finite k, Universe v) => Universe (Map.Map k v) where
   universe = map tableToFunction tables where
     tables          = choices [universe | _ <- monoUniverse]
diff --git a/src/Data/Universe/Generic.hs b/src/Data/Universe/Generic.hs
--- a/src/Data/Universe/Generic.hs
+++ b/src/Data/Universe/Generic.hs
@@ -1,5 +1,11 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FlexibleContexts #-}
+#if __GLASGOW_HASKELL__ >=704
+{-# LANGUAGE Safe #-}
+#elif __GLASGOW_HASKELL__ >=702
+{-# LANGUAGE Trustworthy #-}
+#endif
 module Data.Universe.Generic where
 
 import GHC.Generics
@@ -8,13 +14,14 @@
 import Data.Universe.Helpers
 
 -- $setup
--- >>> :set -XDeriveGeneric -XEmptyDataDeriving
+-- >>> :set -XDeriveGeneric
+-- >>> import GHC.Generics
  
 class GUniverse f where
   guniverse :: [f a]
 
 instance GUniverseSum f => GUniverse (M1 i c f) where
-  guniverse = map M1 $ interleave $ guniverseSum
+  guniverse = map M1 $ interleave guniverseSum
 
 class GUniverseSum f where
   guniverseSum :: [[f a]]
@@ -46,10 +53,6 @@
 
 -- |
 --
--- >>> data Zero deriving (Show, Generic)
--- >>> universeGeneric :: [Zero]
--- []
---
 -- >>> data One = One deriving (Show, Generic)
 -- >>> universeGeneric :: [One] 
 -- [One]
@@ -69,3 +72,13 @@
 --
 universeGeneric :: (Generic a, GUniverse (Rep a)) => [a]
 universeGeneric = map to guniverse 
+
+#if __GLASGOW_HASKELL__ >= 804
+-- $empty
+--
+-- >>> :set -XEmptyDataDeriving
+--
+-- >>> data Zero deriving (Show, Generic)
+-- >>> universeGeneric :: [Zero]
+-- []
+#endif
diff --git a/src/Data/Universe/Helpers.hs b/src/Data/Universe/Helpers.hs
--- a/src/Data/Universe/Helpers.hs
+++ b/src/Data/Universe/Helpers.hs
@@ -1,3 +1,9 @@
+{-# LANGUAGE CPP #-}
+#if __GLASGOW_HASKELL__ >=704
+{-# LANGUAGE Safe #-}
+#elif __GLASGOW_HASKELL__ >=702
+{-# LANGUAGE Trustworthy #-}
+#endif
 module Data.Universe.Helpers (
   -- | This module is for functions that are useful for writing instances,
   -- but not necessarily for using them (and hence are not exported by the
diff --git a/universe-base.cabal b/universe-base.cabal
--- a/universe-base.cabal
+++ b/universe-base.cabal
@@ -1,6 +1,6 @@
-name:          universe-base
-version:       1.1.1
-synopsis:      A class for finite and recursively enumerable types.
+name:               universe-base
+version:            1.1.2
+synopsis:           A class for finite and recursively enumerable types.
 description:
   A class for finite and recursively enumerable types and some helper functions for enumerating them.
   .
@@ -13,18 +13,28 @@
   for types in GHC boot libraries.
   For more instances check @universe-instances-*@ packages.
 
-homepage:      https://github.com/dmwit/universe
-license:       BSD3
-license-file:  LICENSE
-author:        Daniel Wagner
-maintainer:    me@dmwit.com
-copyright:     2014 Daniel Wagner
-category:      Data
-build-type:    Simple
-cabal-version: >=1.10
+homepage:           https://github.com/dmwit/universe
+license:            BSD3
+license-file:       LICENSE
+author:             Daniel Wagner
+maintainer:         me@dmwit.com
+copyright:          2014 Daniel Wagner
+category:           Data
+build-type:         Simple
+cabal-version:      >=1.10
 extra-source-files: changelog
 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
+  GHC ==7.0.4
+   || ==7.4.2
+   || ==7.6.3
+   || ==7.8.4
+   || ==7.10.3
+   || ==8.0.2
+   || ==8.2.2
+   || ==8.4.4
+   || ==8.6.5
+   || ==8.8.4
+   || ==8.10.3
 
 source-repository head
   type:     git
@@ -33,7 +43,7 @@
 source-repository this
   type:     git
   location: https://github.com/dmwit/universe
-  tag:      base-1.1
+  tag:      instances-extended-1.1
 
 library
   default-language: Haskell2010
@@ -42,12 +52,11 @@
     Data.Universe.Class
     Data.Universe.Helpers
 
-  if impl(ghc >= 7.2)
-    exposed-modules:
-      Data.Universe.Generic
+  if impl(ghc >=7.2)
+    exposed-modules: Data.Universe.Generic
+
     if impl(ghc <7.6)
-      build-depends:
-        ghc-prim
+      build-depends: ghc-prim
 
   other-extensions:
     BangPatterns
@@ -57,9 +66,9 @@
     TypeFamilies
 
   build-depends:
-      base          >=4.3     && <4.13
+      base          >=4.3     && <4.16
     , containers    >=0.4.0.0 && <0.7
-    , tagged        >=0.8.4   && <0.9
+    , tagged        >=0.8.6.1 && <0.9
     , transformers  >=0.3.0.0 && <0.6
 
   if impl(ghc >=7.10.3)
@@ -71,15 +80,20 @@
   if !impl(ghc >=7.10)
     build-depends:
         nats  >=1.1.2 && <1.2
-      , void  >=0.7.2 && <0.8
+      , void  >=0.7.3 && <0.8
 
   if !impl(ghc >=8.0)
-    build-depends: semigroups >=0.18.2 && <0.20
+    build-depends: semigroups >=0.18.5 && <0.20
 
   if impl(ghc >=7.4)
     cpp-options:      -DDEFAULT_SIGNATURES
     other-extensions: DefaultSignatures
 
+  if impl(ghc >= 9.0)
+    -- these flags may abort compilation with GHC-8.10
+    -- https://gitlab.haskell.org/ghc/ghc/-/merge_requests/3295
+    ghc-options: -Winferred-safe-imports -Wmissing-safe-haskell-mode
+
 test-suite tests
   default-language: Haskell2010
   other-extensions: ScopedTypeVariables
@@ -90,9 +104,8 @@
   build-depends:
       base
     , containers
-    , QuickCheck     >=2.8.2 && <2.14
+    , QuickCheck     >=2.8.2 && <2.15
     , universe-base
 
   if !impl(ghc >=7.10)
-    build-depends:
-        nats
+    build-depends: nats
