diff --git a/src/Data/Prodder.hs b/src/Data/Prodder.hs
--- a/src/Data/Prodder.hs
+++ b/src/Data/Prodder.hs
@@ -82,9 +82,19 @@
 import Data.Proxy (Proxy(Proxy))
 import Control.Monad.ST
 import Data.STRef (newSTRef, STRef, writeSTRef, readSTRef)
+import Data.Typeable (Typeable)
+import Data.Monoid (Endo (Endo, appEndo))
+import Data.List (intersperse)
+import Data.Foldable (fold)
 
 -- | An extensible product type
 newtype Prod (xs :: [*]) = UnsafeProd { unProd :: Vector Any }
+  deriving (Typeable)
+
+-- | Showing extensible products.
+instance FoldProd Show xs => Show (Prod xs) where
+  showsPrec d xs = showParen (d > 10) . appEndo . fold $
+    [Endo $ \r -> "[" <> r] <> intersperse (Endo $ \r -> ", " <> r) (toList @Show (Endo . showsPrec (d + 1)) xs) <> [Endo $ \r -> "]" <> r]
 
 -- | Lens to modify one element of a product.
 atType :: forall a b xs f. (a `HasIndexIn` xs, Functor f) => (a -> f b) -> Prod xs -> f (Prod (Replace a b xs))
diff --git a/src/Data/Summer.hs b/src/Data/Summer.hs
--- a/src/Data/Summer.hs
+++ b/src/Data/Summer.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE QuantifiedConstraints #-}
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE UndecidableSuperClasses #-}
 {-# LANGUAGE LambdaCase #-}
@@ -67,11 +68,13 @@
 import Generics.SOP (Generic(..))
 import qualified Generics.SOP as SOP
 import Data.Profunctor (Profunctor(dimap), Choice(..))
+import Data.Typeable (typeRep, Typeable)
 import Data.ForAll (type ForAll)
 
 -- | The extensible sum type, allowing inhabitants to be of any of the
 -- types in the given type list.
 data Sum (xs :: [*]) = UnsafeInj {-# UNPACK #-} !Word Any
+  deriving (Typeable)
 
 -- | Deconstruct a 'Sum' with only one variant
 eject :: Sum '[x] -> x
@@ -215,6 +218,18 @@
 instance Eq (Sum '[]) where
   (==) = error "(==) base case: impossible by construction"
   {-# INLINE CONLIKE (==) #-}
+
+-- | Showing extensible sums.
+instance Show (Sum '[]) where
+  showsPrec n uv = error "show base case: impossible by construction"
+instance (Show x, Typeable x, Show (Sum xs)) => Show (Sum (x ': xs)) where
+  showsPrec d uv@(UnsafeInj tag' x)
+    | tag' == 0 = showParen (d > 10) $
+          showString "Inj @"
+        . showParen True (showsPrec (d + 1) (typeRep (Proxy @x)))
+        . showString " "
+        . showParen True (showsPrec @x (d + 1) (unsafeCoerce x))
+    | otherwise = showsPrec @(Sum xs) d (unsafeForgetFirst uv)
 
 -- | Transforming one sum into a sum which contains all of the same types
 class Weaken xs ys where
diff --git a/summer.cabal b/summer.cabal
--- a/summer.cabal
+++ b/summer.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                summer
-version:             0.3.6.0
+version:             0.3.7.0
 synopsis:            An implementation of extensible products and sums
 description:         An implementation of extensible products and sums.
 license:             MIT
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -30,6 +30,10 @@
   , strengthenTest
   , tailNTest
   , initNTest
+  , prodBuilderTest
+  , selectTest
+  , foldProdTest
+  , showTest
   ]
   where
     catchAndDisplay (x : xs) = catch @SomeException x print >> catchAndDisplay xs
@@ -102,6 +106,10 @@
         [ (toList @Show show x == [show "Hello", show True], "toList does not work 0")
         , (toList @Eq (\a -> a == a) x == [True, True], "toList does not work 1")
         ]
+    showTest = do
+      let x :: Prod '[Int, Bool, Char, Float] = produce (\f -> f 10 True 'a' 0.2)
+      require (show x == "[10, True, 'a', 0.2]") "show product 0"
+      
 
 sumTest :: IO ()
 sumTest = catchAndDisplay
@@ -114,6 +122,9 @@
   , inmapTest
   , smapTest
   , unmatchTest
+  , applyTest
+  , unorderedMatchTest
+  , showTest
   ]
   where
     catchAndDisplay (x : xs) = catch @SomeException x print >> catchAndDisplay xs
@@ -187,3 +198,6 @@
     unorderedMatchTest = do
       let x :: Sum '[Int, Bool] = Inj False
       require (unorderedMatch x not (\(x :: Int) -> x == 10)) "unordered match does not work 0"
+    showTest = do
+      let x :: Sum '[Int, Bool] = Inj False
+      require (show x == "Inj @Bool False") "show sum does not work 0"
