diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,9 @@
 # Changelog for exceptions
 
 ## Unreleased changes
+
+## 0.2.0.0
+
+### Breaking changes
+
+- Use `HashMap Text Attribute` instead of `[(Text, Attribute)]` as attributes
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,2 +1,4 @@
 import Distribution.Simple
+
+
 main = defaultMain
diff --git a/hs-opentelemetry-utils-exceptions.cabal b/hs-opentelemetry-utils-exceptions.cabal
--- a/hs-opentelemetry-utils-exceptions.cabal
+++ b/hs-opentelemetry-utils-exceptions.cabal
@@ -1,20 +1,20 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.34.5.
+-- This file has been generated from package.yaml by hpack version 0.35.2.
 --
 -- see: https://github.com/sol/hpack
 
-name:           hs-opentelemetry-utils-exceptions
-version:        0.1.0.0
-description:    Please see the README on GitHub at <https://github.com/iand675/hs-opentelemetry/tree/main/utils/exceptions#readme>
-homepage:       https://github.com/iand675/hs-opentelemetry#readme
-bug-reports:    https://github.com/iand675/hs-opentelemetry/issues
-author:         Ian Duncan
-maintainer:     ian@iankduncan.com
-copyright:      2021 Ian Duncan
-license:        BSD3
-license-file:   LICENSE
-build-type:     Simple
+name:               hs-opentelemetry-utils-exceptions
+version:            0.2.0.0
+description:        Please see the README on GitHub at <https://github.com/iand675/hs-opentelemetry/tree/main/utils/exceptions#readme>
+homepage:           https://github.com/iand675/hs-opentelemetry#readme
+bug-reports:        https://github.com/iand675/hs-opentelemetry/issues
+author:             Ian Duncan, Jade Lovelace
+maintainer:         ian@iankduncan.com
+copyright:          2023 Ian Duncan, Mercury Technologies
+license:            BSD3
+license-file:       LICENSE
+build-type:         Simple
 extra-source-files:
     README.md
     ChangeLog.md
@@ -33,7 +33,7 @@
   build-depends:
       base >=4.7 && <5
     , exceptions
-    , hs-opentelemetry-api ==0.0.3.*
+    , hs-opentelemetry-api ==0.1.*
     , hs-opentelemetry-sdk ==0.0.3.*
     , text
   default-language: Haskell2010
@@ -49,7 +49,7 @@
   build-depends:
       base >=4.7 && <5
     , exceptions
-    , hs-opentelemetry-api ==0.0.3.*
+    , hs-opentelemetry-api ==0.1.*
     , hs-opentelemetry-sdk ==0.0.3.*
     , text
   default-language: Haskell2010
diff --git a/src/OpenTelemetry/Utils/Exceptions.hs b/src/OpenTelemetry/Utils/Exceptions.hs
--- a/src/OpenTelemetry/Utils/Exceptions.hs
+++ b/src/OpenTelemetry/Utils/Exceptions.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE OverloadedLists #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
@@ -12,7 +13,6 @@
 import GHC.Exception (SrcLoc (..), getCallStack)
 import GHC.Stack (CallStack, callStack)
 import GHC.Stack.Types (HasCallStack)
-
 import OpenTelemetry.Context (insertSpan, lookupSpan, removeSpan)
 import OpenTelemetry.Context.ThreadLocal (adjustContext)
 import qualified OpenTelemetry.Context.ThreadLocal as TraceCore.SpanContext
@@ -20,7 +20,8 @@
 import OpenTelemetry.Trace.Core (ToAttribute (..), endSpan, recordException, setStatus, whenSpanIsRecording)
 import qualified OpenTelemetry.Trace.Core as TraceCore
 
-bracketError' :: MonadMask m => m a -> (Maybe SomeException -> a -> m b) -> (a -> m c) -> m c
+
+bracketError' :: (MonadMask m) => m a -> (Maybe SomeException -> a -> m b) -> (a -> m c) -> m c
 bracketError' before after thing = MonadMask.mask $ \restore -> do
   x <- before
   res1 <- MonadMask.try $ restore $ thing x
@@ -38,43 +39,46 @@
       MonadMask.uninterruptibleMask_ $ after Nothing x
       return y
 
+
 -- | The simplest function for annotating code with trace information.
-inSpanM ::
-  (MonadIO m, MonadMask m, HasCallStack) =>
-  Trace.Tracer ->
-  -- | The name of the span. This may be updated later via 'updateName'
-  Text ->
-  -- | Additional options for creating the span, such as 'SpanKind',
+inSpanM
+  :: (MonadIO m, MonadMask m, HasCallStack)
+  => Trace.Tracer
+  -> Text
+  -- ^ The name of the span. This may be updated later via 'updateName'
+  -> Trace.SpanArguments
+  -- ^ Additional options for creating the span, such as 'SpanKind',
   -- span links, starting attributes, etc.
-  Trace.SpanArguments ->
-  -- | The action to perform. 'inSpan' will record the time spent on the
+  -> m a
+  -- ^ The action to perform. 'inSpan' will record the time spent on the
   -- action without forcing strict evaluation of the result. Any uncaught
   -- exceptions will be recorded and rethrown.
-  m a ->
-  m a
+  -> m a
 inSpanM t n args m = inSpanM'' t callStack n args (const m)
 
-inSpanM' ::
-  (MonadIO m, MonadMask m, HasCallStack) =>
-  Trace.Tracer ->
-  -- | The name of the span. This may be updated later via 'updateName'
-  Text ->
-  Trace.SpanArguments ->
-  (Trace.Span -> m a) ->
-  m a
+
+inSpanM'
+  :: (MonadIO m, MonadMask m, HasCallStack)
+  => Trace.Tracer
+  -> Text
+  -- ^ The name of the span. This may be updated later via 'updateName'
+  -> Trace.SpanArguments
+  -> (Trace.Span -> m a)
+  -> m a
 inSpanM' t = inSpanM'' t callStack
 
-inSpanM'' ::
-  (MonadMask m, HasCallStack, MonadIO m) =>
-  Trace.Tracer ->
-  -- | Record the location of the span in the codebase using the provided
+
+inSpanM''
+  :: (MonadMask m, HasCallStack, MonadIO m)
+  => Trace.Tracer
+  -> CallStack
+  -- ^ Record the location of the span in the codebase using the provided
   -- callstack for source location info.
-  CallStack ->
-  -- | The name of the span. This may be updated later via 'updateName'
-  Text ->
-  Trace.SpanArguments ->
-  (Trace.Span -> m a) ->
-  m a
+  -> Text
+  -- ^ The name of the span. This may be updated later via 'updateName'
+  -> Trace.SpanArguments
+  -> (Trace.Span -> m a)
+  -> m a
 inSpanM'' t cs n args f = bracketError' before after (f . snd)
   where
     before = do
@@ -87,18 +91,18 @@
           (fn, loc) : _ -> do
             TraceCore.addAttributes
               s
-              [ ("code.function", toAttribute $ T.pack fn),
-                ("code.namespace", toAttribute $ T.pack $ srcLocModule loc),
-                ("code.filepath", toAttribute $ T.pack $ srcLocFile loc),
-                ("code.lineno", toAttribute $ srcLocStartLine loc),
-                ("code.package", toAttribute $ T.pack $ srcLocPackage loc)
+              [ ("code.function", toAttribute $ T.pack fn)
+              , ("code.namespace", toAttribute $ T.pack $ srcLocModule loc)
+              , ("code.filepath", toAttribute $ T.pack $ srcLocFile loc)
+              , ("code.lineno", toAttribute $ srcLocStartLine loc)
+              , ("code.package", toAttribute $ T.pack $ srcLocPackage loc)
               ]
       pure (lookupSpan ctx, s)
 
     after e (parent, s) = do
       forM_ e $ \(MonadMask.SomeException inner) -> do
         setStatus s $ Trace.Error $ T.pack $ MonadMask.displayException inner
-        recordException s [] Nothing inner
+        recordException s [("exception.escaped", toAttribute True)] Nothing inner
       endSpan s Nothing
       adjustContext $ \ctx ->
         maybe (removeSpan ctx) (`insertSpan` ctx) parent
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,2 +1,3 @@
+
 main :: IO ()
 main = putStrLn "Test suite not yet implemented"
