diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,20 @@
 The format is based on [Keep a Changelog][chg] and this project adheres to
 [Haskell's Package Versioning Policy][pvp]
 
-## 1.0.1 - 2023-12-15
+## `1.1` - 2023-12-18
+
+  - `fallibleRuntime` and `fallibleRuntimeWithContext` report errors to AWS
+    instead of returning `{"Left": "some error"}`.
+  - `fallibleRuntime` and `fallibleRuntimeWithContext` no longer wrap their
+    successful responses in `{"Right": ...}`.
+  - `pureRuntime`, `pureRuntimeWithContext`, `fallibleRuntime` and `fallibleRuntimeWithContext`
+    no longer crash the Lambda runtime if input can't be parsed from JSON.
+  - By default, Aeson 2.2 is used.  This a breaking change only for specific
+    cases when using or maintaining curated package sets (stackage, nix, etc).
+    Optionally, one can set the `use-aeson-2-2` flag to `false` to use an older
+    verison.
+
+## `1.0.1` - 2023-12-15
 
   - Add support for aeson 2.2.  Users can opt in by setting the `use-aeson-2-2` flag to `true`, which for many users will be set automatically.  In a future breaking change release, this flag will default to `true`.
 
diff --git a/hal.cabal b/hal.cabal
--- a/hal.cabal
+++ b/hal.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 135f92bc103710363cac34b23a95869b5a3cdf72e04a2e41652864d0d7559ff7
+-- hash: 68071e7a76bb7ee4441cd578bc9de2a1c3ffb2622ab059ce676d816922ed3d4b
 
 name:           hal
-version:        1.0.1
+version:        1.1
 synopsis:       A runtime environment for Haskell applications running on AWS Lambda.
 description:    This library uniquely supports different types of AWS Lambda Handlers for your
                 needs/comfort with advanced Haskell. Instead of exposing a single function
@@ -32,7 +32,7 @@
 flag use-aeson-2-2
   description: Required parsers are split out into a different package
   manual: False
-  default: False
+  default: True
 
 library
   exposed-modules:
diff --git a/src/AWS/Lambda/Combinators.hs b/src/AWS/Lambda/Combinators.hs
--- a/src/AWS/Lambda/Combinators.hs
+++ b/src/AWS/Lambda/Combinators.hs
@@ -13,7 +13,8 @@
 
 module AWS.Lambda.Combinators (
     withoutContext,
-    withInfallibleParse
+    withInfallibleParse,
+    withFallibleParse
 ) where
 
 import           Data.Aeson             (FromJSON, parseJSON, Value)
@@ -70,3 +71,7 @@
 -- on a failure to convert the JSON AST sent to the Lambda.
 withInfallibleParse :: FromJSON a => (a -> b) -> Value -> b
 withInfallibleParse fn = either error fn . parseEither parseJSON
+
+-- | Like 'withInfallibleParse', but return the result in an 'Either' instead of using 'error'.
+withFallibleParse :: FromJSON a => (a -> b) -> Value -> Either String b
+withFallibleParse fn = fmap fn . parseEither parseJSON
diff --git a/src/AWS/Lambda/Context.hs b/src/AWS/Lambda/Context.hs
--- a/src/AWS/Lambda/Context.hs
+++ b/src/AWS/Lambda/Context.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE NamedFieldPuns, OverloadedStrings #-}
+{-# LANGUAGE NamedFieldPuns #-}
 
 {-|
 Module      : AWS.Lambda.Context
diff --git a/src/AWS/Lambda/Runtime.hs b/src/AWS/Lambda/Runtime.hs
--- a/src/AWS/Lambda/Runtime.hs
+++ b/src/AWS/Lambda/Runtime.hs
@@ -29,9 +29,12 @@
   mRuntimeWithContext
 ) where
 
-import           AWS.Lambda.Combinators   (withInfallibleParse)
+import           AWS.Lambda.Combinators   (withInfallibleParse,
+                                           withFallibleParse,
+                                           withoutContext)
 import           AWS.Lambda.Context       (LambdaContext(..))
 import qualified AWS.Lambda.Runtime.Value as ValueRuntime
+import           Control.Monad            (join)
 import           Control.Monad.Catch      (MonadCatch)
 import           Control.Monad.IO.Class   (MonadIO)
 import           Control.Monad.Reader     (ReaderT)
@@ -253,7 +256,7 @@
 -- @
 fallibleRuntimeWithContext :: (FromJSON event, ToJSON result) =>
   (LambdaContext -> event -> Either String result) -> IO ()
-fallibleRuntimeWithContext = ValueRuntime.fallibleRuntimeWithContext . fmap withInfallibleParse
+fallibleRuntimeWithContext fn = ValueRuntime.fallibleRuntimeWithContext $ \lc -> join . withFallibleParse (fn lc)
 
 -- | For pure functions that can still fail.
 --
@@ -286,7 +289,7 @@
 -- @
 fallibleRuntime :: (FromJSON event, ToJSON result) =>
   (event -> Either String result) -> IO ()
-fallibleRuntime = ValueRuntime.fallibleRuntime . withInfallibleParse
+fallibleRuntime = fallibleRuntimeWithContext . withoutContext
 
 -- | For pure functions that can never fail that also need access to the context.
 --
@@ -318,7 +321,7 @@
 -- @
 pureRuntimeWithContext :: (FromJSON event, ToJSON result) =>
   (LambdaContext -> event -> result) -> IO ()
-pureRuntimeWithContext = ValueRuntime.pureRuntimeWithContext . fmap withInfallibleParse
+pureRuntimeWithContext = fallibleRuntimeWithContext . fmap (fmap pure)
 
 -- | For pure functions that can never fail.
 --
@@ -345,4 +348,4 @@
 -- main = pureRuntime myHandler
 -- @
 pureRuntime :: (FromJSON event, ToJSON result) => (event -> result) -> IO ()
-pureRuntime = ValueRuntime.pureRuntime . withInfallibleParse
+pureRuntime = pureRuntimeWithContext . withoutContext
diff --git a/src/AWS/Lambda/Runtime/Value.hs b/src/AWS/Lambda/Runtime/Value.hs
--- a/src/AWS/Lambda/Runtime/Value.hs
+++ b/src/AWS/Lambda/Runtime/Value.hs
@@ -39,10 +39,11 @@
   mRuntimeWithContext,
 ) where
 
-import           AWS.Lambda.RuntimeClient (RuntimeClientConfig, getRuntimeClientConfig,
-                                           getNextData, sendEventError, sendEventSuccess)
 import           AWS.Lambda.Combinators   (withoutContext)
 import           AWS.Lambda.Context       (LambdaContext(..))
+import           AWS.Lambda.RuntimeClient (RuntimeClientConfig, getNextData,
+                                           getRuntimeClientConfig,
+                                           sendEventError, sendEventSuccess)
 import           Control.Exception        (SomeException, displayException)
 import           Control.Monad            ((<=<), forever)
 import           Control.Monad.Catch      (MonadCatch, try)
@@ -331,7 +332,7 @@
 -- @
 fallibleRuntimeWithContext :: ToJSON result =>
   (LambdaContext -> Value -> Either String result) -> IO ()
-fallibleRuntimeWithContext = mRuntimeWithContext . fmap (fmap pure)
+fallibleRuntimeWithContext fn = mRuntimeWithContext (\lc -> either error pure . fn lc)
 
 -- | For pure functions that can still fail.
 --
