diff --git a/incipit-base.cabal b/incipit-base.cabal
--- a/incipit-base.cabal
+++ b/incipit-base.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           incipit-base
-version:        0.4.1.0
+version:        0.5.0.0
 synopsis:       A Prelude for Polysemy – Base Reexports
 description:    See https://hackage.haskell.org/package/incipit-base/docs/IncipitBase.html
 category:       Prelude
@@ -40,6 +40,7 @@
       Incipit.String
       Incipit.String.Conversion
       Incipit.String.Reexport
+      Incipit.TypeError
       IncipitBase
   reexported-modules:
       Control.Concurrent.STM
diff --git a/lib/Incipit/TypeError.hs b/lib/Incipit/TypeError.hs
new file mode 100644
--- /dev/null
+++ b/lib/Incipit/TypeError.hs
@@ -0,0 +1,24 @@
+{-# language StandaloneKindSignatures #-}
+
+-- | Description: 'ErrorMessage' concatenation operators, stolen from type-errors-pretty.
+module Incipit.TypeError where
+
+import GHC.TypeLits (ErrorMessage (..), Symbol)
+
+type (<>) :: k1 -> k2 -> ErrorMessage
+type family (<>) l r :: ErrorMessage where
+  l <> r = ToErrorMessage l ':<>: ToErrorMessage r
+
+infixl 5 <>
+
+type (%) :: k1 -> k2 -> ErrorMessage
+type family (%) t b :: ErrorMessage where
+  t % b = ToErrorMessage t ':$$: ToErrorMessage b
+
+infixr 4 %
+
+type ToErrorMessage :: k -> ErrorMessage
+type family ToErrorMessage t where
+  ToErrorMessage (t :: Symbol) = 'Text t
+  ToErrorMessage (t :: ErrorMessage) = t
+  ToErrorMessage t = 'ShowType t
diff --git a/lib/IncipitBase.hs b/lib/IncipitBase.hs
--- a/lib/IncipitBase.hs
+++ b/lib/IncipitBase.hs
@@ -14,6 +14,7 @@
   module Incipit.List,
   module Incipit.Misc,
   module Incipit.String,
+  module Incipit.TypeError,
 ) where
 
 import Incipit.Base
@@ -23,3 +24,4 @@
 import Incipit.List
 import Incipit.Misc
 import Incipit.String
+import Incipit.TypeError
