diff --git a/src/Data/Summer.hs b/src/Data/Summer.hs
--- a/src/Data/Summer.hs
+++ b/src/Data/Summer.hs
@@ -36,6 +36,7 @@
   , inspect
   , consider
   , considerFirst
+  , variant
   , Match(match, override, unmatch)
   , Unmatch
   -- * Type families
@@ -64,11 +65,28 @@
 import Control.Monad (unless)
 import Generics.SOP (Generic(..))
 import qualified Generics.SOP as SOP
+import Data.Profunctor (Profunctor(dimap), Choice(..))
 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
+
+-- | A prism which operates on a chosen variant of a 'Sum'
+variant :: forall a b xs p f. (a `HasTagIn` xs, Applicative f, Choice p) => p a (f b) -> p (Sum xs) (f (Sum (Replace a b xs)))
+variant p = dimap try replace (left' p) where
+  try :: Sum xs -> Either a (Sum (Replace a b xs))
+  try (UnsafeInj t x) = if t == tag @a @xs then Left (unsafeCoerce x) else Right (UnsafeInj t x)
+  replace :: Either (f b) (Sum (Replace a b xs)) -> f (Sum (Replace a b xs))
+  replace = \case
+    Left fb -> fmap (UnsafeInj (tag @a @xs) . unsafeCoerce) fb
+    Right s -> pure s
+
+-- | Type family for replacing one type in a type level list with another
+type family Replace x y xs where
+  Replace x y (x ': xs) = y ': xs
+  Replace x y (z ': xs) = z ': Replace x y xs
+  Replace x y '[] = '[]
 
 instance Generic (Sum '[]) where
   type Code (Sum '[]) = '[]
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.2.0
+version:             0.3.4.0
 synopsis:            An implementation of extensible products and sums
 description:         An implementation of extensible products and sums.
 license:             MIT
@@ -21,7 +21,7 @@
 library
   exposed-modules:     Data.Summer, Data.Prodder
   other-modules:       Data.ForAll
-  build-depends:       base >=4.12 && <4.16, vector >=0.12, generics-sop >=0.5
+  build-depends:       base >=4.12 && <4.16, vector >=0.12, generics-sop >=0.5, profunctors >=5.6
   hs-source-dirs:      src
   default-language:    Haskell2010
 
