diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 1.0.6.0
+
+* Add `mapNonNull` function to `Data.NonNull` [#150](https://github.com/snoyberg/mono-traversable/issues/150)
+
 ## 1.0.5.0
 
 * Move `oelem` and `onotElem` into the `MonoFoldable` class [#133](https://github.com/snoyberg/mono-traversable/issues/133)
diff --git a/mono-traversable.cabal b/mono-traversable.cabal
--- a/mono-traversable.cabal
+++ b/mono-traversable.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: f018b4ea166006fa7ec7d69a0b78999cc474978f817b1ede26524a3982e90f9e
+-- hash: bc8a0b9aa12636444123bfbeb72078faed482f924d48c553daf2ced10e993bb6
 
 name:           mono-traversable
-version:        1.0.5.0
+version:        1.0.6.0
 synopsis:       Type classes for mapping, folding, and traversing monomorphic containers
 description:    Please see the README at <https://www.stackage.org/package/mono-traversable>
 category:       Data
diff --git a/src/Data/NonNull.hs b/src/Data/NonNull.hs
--- a/src/Data/NonNull.hs
+++ b/src/Data/NonNull.hs
@@ -36,6 +36,7 @@
   , minimumBy
   , (<|)
   , toMinList
+  , mapNonNull
   , GrowingAppend
 ) where
 
@@ -348,3 +349,20 @@
           -> Element mono
 minimumBy cmp = minimumByEx cmp . toNullable
 {-# INLINE minimumBy #-}
+
+-- | 'fmap' over the underlying container in a 'NonNull'.
+--
+-- @since 1.0.6.0
+
+-- ==== __Examples__
+--
+-- @
+-- > let xs = 'ncons' 1 [2, 3 :: Int]
+-- > 'mapNonNull' 'show' xs
+-- 'NonNull' {toNullable = [\"1\",\"2\",\"3\"]}
+-- @
+mapNonNull :: (Functor f, MonoFoldable (f b))
+           => (a -> b)
+           -> NonNull (f a)
+           -> NonNull (f b)
+mapNonNull f = impureNonNull . fmap f . toNullable
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -3,6 +3,8 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE ViewPatterns #-}
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE PatternSynonyms #-}
 
 module Spec where
 
@@ -19,6 +21,7 @@
 import Test.Hspec.QuickCheck
 import Test.HUnit ((@?=))
 import Test.QuickCheck hiding (NonEmptyList(..))
+import Test.QuickCheck.Function (pattern Fn)
 import qualified Test.QuickCheck.Modifiers as QCM
 
 import Data.Text (Text)
@@ -206,6 +209,15 @@
         describe "fromNonEmpty" $ do
             prop "toMinList" $ \(NonEmpty' ne) ->
                 (NE.toList ne :: [Int]) @?= NN.toNullable (NN.toMinList ne)
+
+        describe "mapNonNull" $ do
+            prop "mapNonNull id == id" $ \x xs ->
+                let nonNull = NN.ncons x (xs :: [Int])
+                in NN.mapNonNull Prelude.id nonNull @?= nonNull
+            prop "mapNonNull (f . g) == mapNonNull f . mapNonNull g" $
+                \(Fn (f :: Integer -> String)) (Fn (g :: Int -> Integer)) x xs ->
+                    let nns = NN.ncons x (xs :: [Int])
+                    in NN.mapNonNull (f . g) nns @?= NN.mapNonNull f (NN.mapNonNull g nns)
 
         let -- | Type restricted 'NN.ncons'
             nconsAs :: IsSequence seq => Element seq -> [Element seq] -> seq -> NN.NonNull seq
