diff --git a/Data/Array/Base.hs b/Data/Array/Base.hs
index 0cea07178d742c1ad60ec81ac7510e6a48916105..2862125c9e7ff66765ddff66de9369f02abf993e 100644
--- a/Data/Array/Base.hs
+++ b/Data/Array/Base.hs
@@ -922,6 +922,31 @@ writeArray marr i e = do
   n <- getNumElements marr
   unsafeWrite marr (safeIndex (l,u) n i) e
 
+{-# INLINE modifyArray #-}
+-- | Modify an element in a mutable array
+--
+-- @since FIXME
+modifyArray :: (MArray a e m, Ix i) => a i e -> i -> (e -> e) -> m ()
+modifyArray marr i f = do
+  (l,u) <- getBounds marr
+  n <- getNumElements marr
+  let idx = safeIndex (l,u) n i
+  x <- unsafeRead marr idx
+  unsafeWrite marr idx (f x)
+
+{-# INLINE modifyArray' #-}
+-- | Modify an element in a mutable array. Strict in the written element.
+--
+-- @since FIXME
+modifyArray' :: (MArray a e m, Ix i) => a i e -> i -> (e -> e) -> m ()
+modifyArray' marr i f = do
+  (l,u) <- getBounds marr
+  n <- getNumElements marr
+  let idx = safeIndex (l,u) n i
+  x <- unsafeRead marr idx
+  let !x' = f x
+  unsafeWrite marr idx x'
+
 {-# INLINE getElems #-}
 -- | Return a list of all the elements of a mutable array
 getElems :: (MArray a e m, Ix i) => a i e -> m [e]
diff --git a/Data/Array/MArray.hs b/Data/Array/MArray.hs
index 7f0f10541fad344ae9b95f6ae9db7badea9d971b..7a89f3951a65f41a3dd03c48fae1291402f3fb0b 100644
--- a/Data/Array/MArray.hs
+++ b/Data/Array/MArray.hs
@@ -31,6 +31,8 @@ module Data.Array.MArray (
     -- * Reading and writing mutable arrays
     readArray,    -- :: (MArray a e m, Ix i) => a i e -> i -> m e
     writeArray,   -- :: (MArray a e m, Ix i) => a i e -> i -> e -> m ()
+    modifyArray,
+    modifyArray',
 
     -- * Derived arrays
     mapArray,     -- :: (MArray a e' m, MArray a e m, Ix i) => (e' -> e) -> a i e' -> m (a i e)
diff --git a/changelog.md b/changelog.md
index fb51a09181e7234abc45dd0b65d3af63487e488b..d6f11e41fba3d9873c2a02a24e5673ae15b16c2c 100644
--- a/changelog.md
+++ b/changelog.md
@@ -9,6 +9,10 @@
 
   * Add `Data.Array.IArray.(!?)`
 
+  * Add `Data.Array.MArray.modifyArray` and `Data.Array.MArray.modifyArray'`.
+    These are also exposed from `Data.Array.IO`, `Data.Array.ST`, and
+    `Data.Array.Storable`.
+
 ## 0.5.5.0  *February 2022*
 
   * Compatibility with GHC's new JavaScript backend.