diff --git a/praglude.cabal b/praglude.cabal
--- a/praglude.cabal
+++ b/praglude.cabal
@@ -1,5 +1,5 @@
 name: praglude
-version: 0.1.2.0
+version: 0.2.0.0
 synopsis: A pragmatic Prelude
 description: An opinionated alternative Prelude, focused on practicality.
 homepage: https://github.com/tdammers/praglude
@@ -10,33 +10,32 @@
 copyright: 2016 Tobias Dammers
 category: Web
 build-type: Simple
--- extra-source-files:
 cabal-version: >=1.10
 
 library
   hs-source-dirs: src
   exposed-modules: Praglude
-  build-depends: base >= 4.7 && < 5
-               , aeson
-               , bytestring
-               , base64-bytestring
-               , casing
-               , containers
-               , data-default
-               , deepseq
-               , directory
-               , filepath
-               , hashable
-               , lens
-               , template-haskell
-               , mtl
-               , random
-               , semigroups
-               , string-convert
-               , text
-               , time
-               , unordered-containers
-               , vector
+  build-depends: base >=4.9 && <5
+               , aeson >=0.11.2.1 && <0.12
+               , bytestring >=0.10.8.1 && <0.11
+               , base64-bytestring >=1.0.0.1 && <1.1
+               , casing >=0.1.0.1 && <0.2
+               , containers >=0.5.7.1 && <0.6
+               , data-default >=0.7.1.1 && <0.8
+               , deepseq >=1.4.2.0 && <1.5
+               , directory >=1.2.6.2 && <1.3
+               , filepath >=1.4.1.0 && <1.5
+               , hashable >=1.2.4.0 && <1.3
+               , lens ==4.14.*
+               , template-haskell >=2.11.0.0 && <2.12
+               , mtl >=2.2.1 && <2.3
+               , random ==1.1.*
+               , semigroups >=0.18.2 && <0.19
+               , string-convert >=3.0.1 && <3.1
+               , text >=1.2.2.1 && <1.3
+               , time >=1.1 && <2
+               , unordered-containers >=0.2.7.1 && <0.3
+               , vector >=0.11.0.0 && <0.12
   default-language: Haskell2010
 
 source-repository head
diff --git a/src/Praglude.hs b/src/Praglude.hs
--- a/src/Praglude.hs
+++ b/src/Praglude.hs
@@ -1305,7 +1305,6 @@
 import qualified Data.Aeson as JSON
 import qualified Data.Aeson.TH as JSON
 import Data.Default
-import Data.List (foldl')
 import Control.Concurrent
 import Control.Exception
 import Data.Function
@@ -1357,7 +1356,7 @@
 -- we can tie laziness into the type itself (similar to how it works
 -- for 'Text' and 'ByteString').
 newtype LHashMap k v = LHashMap { unLHashMap :: LHashMap.HashMap k v }
-    deriving (Read, Show, Typeable, Generic, Functor, Foldable, Traversable, Eq, Data, Semigroup, Monoid, NFData, Hashable)
+    deriving (Read, Show, Typeable, Generic, Functor, Foldable, Traversable, Eq, Data, Semigroup, Monoid, NFData)
 
 type HashSet = HashSet.HashSet
 
@@ -1523,7 +1522,7 @@
     -- | Delete by key
     delete :: k -> m k v -> m k v
     -- | Modify an element at a key
-    update :: k -> (v -> Maybe v) -> m k v -> m k v
+    adjust :: k -> (v -> v) -> m k v -> m k v
     -- | Convert to an association list (list of key/value pairs)
     pairs :: m k v -> [(k, v)]
     -- | Convert from an association list (list of key/value pairs)
@@ -1543,7 +1542,7 @@
 instance Eq k => DictLike AList k where
     insert k v (AList xs) = AList $ (k,v):xs
     delete k (AList xs) = AList $ filter ((/= k) . fst) xs
-    update k f (AList xs) = AList [ (k, fromMaybe v $ f v) | (k, v) <- xs ]
+    adjust k f (AList xs) = AList [ (k', if k == k' then f v else v) | (k', v) <- xs ]
     pairs = unAList
     fromPairs = AList
     singletonMap k v = AList [(k, v)]
@@ -1611,7 +1610,7 @@
 instance (Eq k, Hashable k) => DictLike HashMap.HashMap k where
     insert = HashMap.insert
     delete = HashMap.delete
-    update = flip HashMap.update
+    adjust = flip HashMap.adjust
     pairs = HashMap.toList
     fromPairs = HashMap.fromList
     keys = HashMap.keys
@@ -1636,7 +1635,7 @@
 instance (Eq k, Ord k) => DictLike Map.Map k where
     insert = Map.insert
     delete = Map.delete
-    update = flip Map.update
+    adjust = flip Map.adjust
     pairs = Map.toList
     fromPairs = Map.fromList
     keys = Map.keys
@@ -1661,7 +1660,7 @@
 instance (Eq k, Hashable k) => DictLike LHashMap k where
     insert k v = overLHashMap $ LHashMap.insert k v
     delete k = overLHashMap $ LHashMap.delete k
-    update k f = overLHashMap $ LHashMap.update f k
+    adjust k f = overLHashMap $ LHashMap.adjust f k
     pairs = LHashMap.toList . unLHashMap
     fromPairs = LHashMap . LHashMap.fromList
     keys = LHashMap.keys . unLHashMap
