diff --git a/concurrent-hashtable.cabal b/concurrent-hashtable.cabal
--- a/concurrent-hashtable.cabal
+++ b/concurrent-hashtable.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: b094e3fb9eeeb3caeb888a7f25fac54aac09728f36b3dd9019aba9518a5cc7c7
+-- hash: 52facc0875c55e5699c89da7fd34cc82941cf1e89d804012a77d6332ee3e712e
 
 name:           concurrent-hashtable
-version:        0.1.5
+version:        0.1.6
 synopsis:       Thread-safe hash tables for multi-cores!
 description:    Please see the README on GitHub at <https://github.com/pwrobinson/concurrent-hashtable#readme>
 category:       Concurrency
diff --git a/src/Data/HashTable.hs b/src/Data/HashTable.hs
--- a/src/Data/HashTable.hs
+++ b/src/Data/HashTable.hs
@@ -25,7 +25,7 @@
 -- > [(1,"hello"),(3,"!"),(2,"world")]
 --
 -- List of atomic operations:
--- /insert/, /insertIfNotExists/, /lookup/, /delete/, /getAssocs/, /resize/
+-- 'insert', 'insertIfNotExists', 'update', 'lookup', 'delete', 'readAssocs', 'resize'
 --
 ----------------------------------------------------------------------
 
@@ -39,6 +39,7 @@
         lookup,
         insert,
         insertIfNotExists,
+        update,
         delete,
         readAssocs,
         readSizeIO,
diff --git a/src/Data/HashTable/Internal.hs b/src/Data/HashTable/Internal.hs
--- a/src/Data/HashTable/Internal.hs
+++ b/src/Data/HashTable/Internal.hs
@@ -10,8 +10,6 @@
 --
 -- You can find benchmarks and more information about the internals of this package here:  <https://lowerbound.io/blog/2019-10-24_concurrent_hash_table_performance.html>
 --
--- List of atomic operations:
--- /insert/, /insertIfNotExists/, /lookup/, /delete/, /readAssocs/, /resize/
 ----------------------------------------------------------------------
 {-# LANGUAGE MultiParamTypeClasses, ScopedTypeVariables #-}
 module Data.HashTable.Internal
@@ -199,7 +197,8 @@
         Nothing -> genericModify htable k stmAction
         Just v  -> return v
 
--- | Inserts the key-value pair `k` `v` into the hash table. Uses chain hashing to resolve collisions.
+-- | Inserts the key-value pair `k` `v` into the hash table. Uses chain hashing to resolve collisions. If you want to update the entry only if it already exists, use 'update'. If you want to update the entry only if it does *not* exist, use
+-- 'insertIfNotExists'.
 insert :: (Eq k)
        => HashTable k v
        -> k -- ^ key
@@ -220,7 +219,7 @@
     return result
 
 
--- | Inserts a key and value pair into the hash table only if the key does not exist yet. Returns 'True' if the insertion was successful, i.e., the hash table did not contain this key before. To get the same behaviour as 'Data.Map.insert', use 'insert'. If you want to update an entry only if it exists, use 'update'.
+-- | Inserts a key and value pair into the hash table only if the key does not exist yet. Returns `True` if the insertion was successful, i.e., the hash table did not contain this key before. To get the same behaviour as 'Data.Map.insert', use 'insert'. If you want to update an entry only if it exists, use 'update'.
 insertIfNotExists :: (Eq k)
        => HashTable k v
        -> k -- ^ key
@@ -237,6 +236,23 @@
     when result $
         atomicallyChangeLoad htable 1
     return result
+
+-- | Updates the value for key `k`. If `k` is not in the hash table, it skips the update and returns `False`.
+update :: (Eq k)
+       => HashTable k v
+       -> k -- ^ key
+       -> v -- ^ value
+       -> IO Bool
+update htable k v = 
+    genericModify htable k $ \tvar -> do
+                list <- readTVar tvar
+                case L.lookup k list of
+                    Nothing -> do
+                        return $ Just False
+                    Just _  -> do -- entry was already there, so we overwrite it
+                        writeTVar tvar ((k,v) : deleteFirstKey k list)
+                        return $ Just True
+
 
 -- | Deletes the entry for the given key from the hash table. Returns `True` if and only if an entry was deleted from the table.
 delete :: (Eq k)
