diff --git a/semigroups.cabal b/semigroups.cabal
--- a/semigroups.cabal
+++ b/semigroups.cabal
@@ -1,6 +1,6 @@
 name:          semigroups
 category:      Algebra, Data, Data Structures, Math
-version:       0.15.2
+version:       0.15.3
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
@@ -48,6 +48,14 @@
   default: True
   manual: True
 
+flag deepseq
+  description:
+    You can disable the use of the `deepseq` package using `-f-deepseq`.
+    .
+    Disabing this is an unsupported configuration, but it may be useful for accelerating builds in sandboxes for expert users.
+  default: True
+  manual: True
+
 flag text
   description:
     You can disable the use of the `text` package using `-f-text`.
@@ -85,6 +93,9 @@
 
   if flag(containers)
     build-depends: containers >= 0.3 && < 0.6
+
+  if flag(deepseq)
+    build-depends: deepseq >= 1.1 && < 1.4
 
   if flag(text)
     build-depends: text >= 0.10 && < 2
diff --git a/src/Data/List/NonEmpty.hs b/src/Data/List/NonEmpty.hs
--- a/src/Data/List/NonEmpty.hs
+++ b/src/Data/List/NonEmpty.hs
@@ -120,6 +120,11 @@
   )
 
 import Control.Applicative
+
+#ifdef MIN_VERSION_deepseq
+import Control.DeepSeq (NFData(..))
+#endif
+
 import Control.Monad
 
 #ifdef LANGUAGE_DeriveDataTypeable
@@ -175,6 +180,11 @@
   type Item (NonEmpty a) = a
   fromList = fromList
   toList = toList
+#endif
+
+#ifdef MIN_VERSION_deepseq
+instance NFData a => NFData (NonEmpty a) where
+  rnf (x :| xs) = rnf x `seq` rnf xs
 #endif
 
 length :: NonEmpty a -> Int
diff --git a/src/Data/Semigroup.hs b/src/Data/Semigroup.hs
--- a/src/Data/Semigroup.hs
+++ b/src/Data/Semigroup.hs
@@ -81,6 +81,10 @@
 import Data.List.NonEmpty
 import Numeric.Natural.Internal
 
+#ifdef MIN_VERSION_deepseq
+import Control.DeepSeq (NFData(..))
+#endif
+
 #ifdef MIN_VERSION_containers
 import Data.Sequence (Seq, (><))
 import Data.Set (Set)
@@ -322,6 +326,11 @@
 instance MonadFix Min where
   mfix f = fix (f . getMin)
 
+#ifdef MIN_VERSION_deepseq
+instance NFData a => NFData (Min a) where
+  rnf (Min a) = rnf a
+#endif
+
 newtype Max a = Max { getMax :: a } deriving
   ( Eq, Ord, Show, Read
 #ifdef LANGUAGE_DeriveDataTypeable
@@ -386,6 +395,11 @@
 instance MonadFix Max where
   mfix f = fix (f . getMax)
 
+#ifdef MIN_VERSION_deepseq
+instance NFData a => NFData (Max a) where
+  rnf (Max a) = rnf a
+#endif
+
 -- | Use @'Option' ('First' a)@ to get the behavior of 'Data.Monoid.First' from @Data.Monoid@.
 newtype First a = First { getFirst :: a } deriving
   ( Eq, Ord, Show, Read
@@ -448,6 +462,11 @@
 instance MonadFix First where
   mfix f = fix (f . getFirst)
 
+#ifdef MIN_VERSION_deepseq
+instance NFData a => NFData (First a) where
+  rnf (First a) = rnf a
+#endif
+
 -- | Use @'Option' ('Last' a)@ to get the behavior of 'Data.Monoid.Last' from @Data.Monoid@
 newtype Last a = Last { getLast :: a } deriving
   ( Eq, Ord, Show, Read
@@ -510,6 +529,11 @@
 instance MonadFix Last where
   mfix f = fix (f . getLast)
 
+#ifdef MIN_VERSION_deepseq
+instance NFData a => NFData (Last a) where
+  rnf (Last a) = rnf a
+#endif
+
 -- (==)/XNOR on Bool forms a 'Semigroup', but has no good name
 
 #ifdef MIN_VERSION_bytestring
@@ -579,6 +603,11 @@
   enumFromTo (WrapMonoid a) (WrapMonoid b) = WrapMonoid <$> enumFromTo a b
   enumFromThenTo (WrapMonoid a) (WrapMonoid b) (WrapMonoid c) = WrapMonoid <$> enumFromThenTo a b c
 
+#ifdef MIN_VERSION_deepseq
+instance NFData m => NFData (WrappedMonoid m) where
+  rnf (WrapMonoid a) = rnf a
+#endif
+
 -- | Repeat a value @n@ times.
 --
 -- > timesN n a = a <> a <> ... <> a  -- using <> (n-1) times
@@ -649,6 +678,11 @@
 instance Traversable Option where
   traverse f (Option (Just a)) = Option . Just <$> f a
   traverse _ (Option Nothing)  = pure (Option Nothing)
+
+#ifdef MIN_VERSION_deepseq
+instance NFData a => NFData (Option a) where
+  rnf (Option a) = rnf a
+#endif
 
 -- | Fold an 'Option' case-wise, just like 'maybe'.
 option :: b -> (a -> b) -> Option a -> b
