diff --git a/Data/EnumMap/Base.hs b/Data/EnumMap/Base.hs
--- a/Data/EnumMap/Base.hs
+++ b/Data/EnumMap/Base.hs
@@ -54,6 +54,7 @@
   , updateWithKey
   , updateLookupWithKey
   , alter
+  , alterF
 
   -- * Combine
 
@@ -146,6 +147,8 @@
   , isProperSubmapOfBy
 
   -- * Min\/Max
+  , lookupMin
+  , lookupMax
   , findMin
   , findMax
   , deleteMin
@@ -327,6 +330,10 @@
 alter f k = EnumMap . I.alter f (fromEnum k) . unWrap
 {-# INLINE alter #-}
 
+alterF :: (Enum k, Functor f) => (Maybe a -> f (Maybe a)) -> k -> EnumMap k a -> f (EnumMap k a)
+alterF f k = fmap EnumMap . I.alterF f (fromEnum k) . unWrap
+{-# INLINE alterF #-}
+
 unions :: [EnumMap k a] -> EnumMap k a
 unions = EnumMap . I.unions . P.map unWrap
 {-# INLINE unions #-}
@@ -437,6 +444,14 @@
 deleteFindMin :: (Enum k) => EnumMap k a -> ((k, a), EnumMap k a)
 deleteFindMin = (first toEnum *** EnumMap) . I.deleteFindMin . unWrap
 {-# INLINE deleteFindMin #-}
+
+lookupMin :: (Enum k) => EnumMap k a -> Maybe (k, a)
+lookupMin = fmap (first toEnum) . I.lookupMin . unWrap
+{-# INLINE lookupMin #-}
+
+lookupMax :: (Enum k) => EnumMap k a -> Maybe (k, a)
+lookupMax = fmap (first toEnum) . I.lookupMax . unWrap
+{-# INLINE lookupMax #-}
 
 findMin :: (Enum k) => EnumMap k a -> (k, a)
 findMin = first toEnum . I.findMin . unWrap
diff --git a/Data/EnumMap/Lazy.hs b/Data/EnumMap/Lazy.hs
--- a/Data/EnumMap/Lazy.hs
+++ b/Data/EnumMap/Lazy.hs
@@ -54,6 +54,7 @@
   , updateWithKey
   , updateLookupWithKey
   , alter
+  , alterF
 
   -- * Combine
 
@@ -146,6 +147,8 @@
   , isProperSubmapOfBy
 
   -- * Min\/Max
+  , lookupMin
+  , lookupMax
   , findMin
   , findMax
   , deleteMin
diff --git a/Data/EnumMap/Strict.hs b/Data/EnumMap/Strict.hs
--- a/Data/EnumMap/Strict.hs
+++ b/Data/EnumMap/Strict.hs
@@ -54,6 +54,7 @@
   , updateWithKey
   , updateLookupWithKey
   , alter
+  , alterF
 
   -- * Combine
 
@@ -146,6 +147,8 @@
   , isProperSubmapOfBy
 
   -- * Min\/Max
+  , lookupMin
+  , lookupMax
   , findMin
   , findMax
   , deleteMin
@@ -172,7 +175,7 @@
 import           Data.EnumSet (EnumSet)
 import qualified Data.EnumSet as EnumSet
 
-import Data.EnumMap.Base hiding (adjust, adjustWithKey, alter, differenceWith,
+import Data.EnumMap.Base hiding (adjust, adjustWithKey, alter, alterF, differenceWith,
                           differenceWithKey, findWithDefault, fromAscList,
                           fromAscListWith, fromAscListWithKey,
                           fromDistinctAscList, fromList, fromListWith,
@@ -225,6 +228,10 @@
 alter :: (Enum k) => (Maybe a -> Maybe a) -> k -> EnumMap k a -> EnumMap k a
 alter f k = EnumMap . I.alter f (fromEnum k) . unWrap
 {-# INLINE alter #-}
+
+alterF :: (Enum k, Functor f) => (Maybe a -> f (Maybe a)) -> k -> EnumMap k a -> f (EnumMap k a)
+alterF f k = fmap EnumMap . I.alterF f (fromEnum k) . unWrap
+{-# INLINE alterF #-}
 
 unionsWith :: (a -> a -> a) -> [EnumMap k a] -> EnumMap k a
 unionsWith f = EnumMap . I.unionsWith f . P.map unWrap
diff --git a/enummapset.cabal b/enummapset.cabal
--- a/enummapset.cabal
+++ b/enummapset.cabal
@@ -1,5 +1,5 @@
 name:           enummapset
-version:        0.7.0.0
+version:        0.7.1.0
 synopsis:       IntMap and IntSet with Enum keys/elements.
 description:    This package contains simple wrappers around 'Data.IntMap' and
                 'Data.IntSet' with 'Enum' keys and elements respectively.
@@ -46,9 +46,11 @@
     base >= 4.6 && < 5,
     aeson,
     containers >= 0.5.11 && < 0.7,
-    semigroups >=0.1 && <1.0,
     deepseq >= 1.2 && < 1.5
 
+  if impl(ghc < 8.0)
+    build-depends: semigroups >=0.1 && <1.0
+
   if flag(debug)
     ghc-options: -Wall
 
@@ -84,10 +86,12 @@
     containers,
     deepseq,
     ghc-prim,
-    semigroups,
 
     HUnit,
     QuickCheck >= 2.7.1,
     test-framework,
     test-framework-hunit,
     test-framework-quickcheck2
+  
+  if impl(ghc < 8.0)
+    build-depends: semigroups
