Haskell deep clone and recursive merge of values

Haskell
import Data.List (foldl')

data Value = VObj [(String, Value)] | VArr [Value] | VStr String | VNum Double
  deriving (Eq, Show)

deepClone :: Value -> Value
deepClone (VObj kvs) = VObj [(k, deepClone v) | (k, v) <- kvs]
deepClone (VArr vs) = VArr (map deepClone vs)
deepClone v = v

deepMerge :: Value -> Value -> Value
deepMerge (VObj a) (VObj b) = VObj (foldl' upsert a b)
  where
    upsert acc (k, v) = case lookup k acc of
      Just old -> (k, deepMerge old v) : filter ((/= k) . fst) acc
      Nothing -> (k, deepClone v) : acc
deepMerge (VArr a) (VArr b) = VArr (a ++ b)
deepMerge _ b = deepClone b