diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,7 @@
+# v0.1.1
+
+Added `projectGuard` and `NFData`/`NFData1` instances.
+
+# v0.1
+
+Initial release.
diff --git a/fastsum.cabal b/fastsum.cabal
--- a/fastsum.cabal
+++ b/fastsum.cabal
@@ -1,5 +1,5 @@
 name:                fastsum
-version:             0.1.0.0
+version:             0.1.1.0
 synopsis:            A fast open-union type suitable for 100+ contained alternatives
 homepage:            https://github.com/patrickt/fastsum#readme
 license:             BSD3
@@ -10,8 +10,11 @@
 category:            Data
 build-type:          Simple
 extra-source-files:  README.md
+                     ChangeLog.md
 cabal-version:       >=1.10
 tested-with:         GHC == 8.2.2
+                     GHC == 8.4.3
+                     GHC == 8.6.3
 description:
             This package provides Data.Sum, an open-union type, similar to the Union type
             that powers the implementation of Oleg Kiselyov's extensible-effects library.
@@ -34,9 +37,10 @@
   exposed-modules:     Data.Sum
   other-modules:       Data.Sum.Templates
   build-depends:       base >= 4.7 && < 5
-                     , ghc-prim
-                     , hashable
-                     , template-haskell
+                     , deepseq >= 1.4 && <2
+                     , ghc-prim >= 0.5 && <1
+                     , hashable >= 1.2 && <2
+                     , template-haskell >= 2.12 && <3
   default-language:    Haskell2010
 
 executable example
diff --git a/src/Data/Sum.hs b/src/Data/Sum.hs
--- a/src/Data/Sum.hs
+++ b/src/Data/Sum.hs
@@ -35,6 +35,7 @@
   -- * Creating and extracting sums from products
   , inject
   , project
+  , projectGuard
   -- * Operating on sums' effects lists
   , decompose
   , decomposeLast
@@ -45,12 +46,16 @@
   , Elements
   , type(:<:)
   , ElemIndex
+  , elemIndex
   -- * Typeclass application.
   , Apply(..)
   , apply'
   , apply2
+  , apply2'
   ) where
 
+import Control.Applicative (Alternative (..))
+import Control.DeepSeq (NFData(..), NFData1(..))
 import Data.Functor.Classes (Eq1(..), eq1, Ord1(..), compare1, Show1(..), showsPrec1)
 import Data.Hashable (Hashable(..))
 import Data.Hashable.Lifted (Hashable1(..), hashWithSalt1)
@@ -61,7 +66,7 @@
 import GHC.TypeLits
 import Unsafe.Coerce(unsafeCoerce)
 
-pure [mkElemIndexTypeFamily 150]
+pure [mkElemIndexTypeFamily 200]
 
 infixr 5 :<
 
@@ -106,6 +111,10 @@
 project = unsafeProject (unP (elemNo :: P e r))
 {-# INLINE project #-}
 
+-- | As 'project', but generalized to any 'Alternative' functor.
+projectGuard :: forall m e r v . (Alternative m, e :< r) => Sum r v -> m (e v)
+projectGuard = maybe empty pure . project
+
 -- | Attempts to extract the head type @e@ from a @Sum@. Returns
 -- @Right@ on success, and a @Sum@ without @e@ otherwise. You can
 -- repeatedly apply this and apply 'decomposeLast' when you have @Sum
@@ -134,6 +143,9 @@
 -- turned on to use this.
 type (t :< r) = Element t r
 
+elemIndex :: Sum r w -> Int
+elemIndex (Sum n _) = n
+
 -- Find an index of an element in an `r'.
 -- The element must exist, so this is essentially a compile-time computation.
 elemNo :: forall t r . (t :< r) => P t r
@@ -165,7 +177,7 @@
   | otherwise = Nothing
 {-# INLINABLE apply2' #-}
 
-pure (mkApplyInstance <$> [1..150])
+pure (mkApplyInstance <$> [1..200])
 
 
 instance Apply Foldable fs => Foldable (Sum fs) where
@@ -233,3 +245,11 @@
 instance (Apply Hashable1 fs, Hashable a) => Hashable (Sum fs a) where
   hashWithSalt = hashWithSalt1
   {-# INLINABLE hashWithSalt #-}
+
+instance Apply NFData1 fs => NFData1 (Sum fs) where
+  liftRnf rnf' u@(Sum n _) = apply @NFData1 (liftRnf rnf') u
+  {-# INLINABLE liftRnf #-}
+
+instance (Apply NFData1 fs, NFData a) => NFData (Sum fs a) where
+  rnf u@(Sum n _) = rnf n `seq` liftRnf rnf u
+  {-# INLINABLE rnf #-}
