diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2026-08-06 v1.14.1.0
+	* Add layout processing for HsLam
+	* Establish a layout offset for class and instance bodies (@simonhorlick)
 2025-10-14 v1.14.0.0
 	* Support GHC 9.14.1
 2025-01-21 v1.12.0.0
diff --git a/ghc-exactprint.cabal b/ghc-exactprint.cabal
--- a/ghc-exactprint.cabal
+++ b/ghc-exactprint.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                ghc-exactprint
-version:             1.14.0.0
+version:             1.14.1.0
 synopsis:            ExactPrint for GHC
 description:         Using the API Annotations available from GHC 9.2.1, this
                      library provides a means to round trip any code that can
diff --git a/src/Language/Haskell/GHC/ExactPrint/ExactPrint.hs b/src/Language/Haskell/GHC/ExactPrint/ExactPrint.hs
--- a/src/Language/Haskell/GHC/ExactPrint/ExactPrint.hs
+++ b/src/Language/Haskell/GHC/ExactPrint/ExactPrint.hs
@@ -2217,7 +2217,7 @@
           (mbWarn', i', w', mbOverlap', inst_ty') <- top_matter
           oc' <- markEpToken oc
           semis' <- mapM markEpToken semis
-          (sortKey', ds) <- withSortKey sortKey
+          (sortKey', ds) <- setLayoutBoth $ withSortKey sortKey
                                [(ClsAtTag, prepareListAnnotationA ats),
                                 (ClsAtdTag, prepareListAnnotationF adts),
                                 (ClsMethodTag, prepareListAnnotationA binds),
@@ -2883,7 +2883,7 @@
              LamSingle -> return an0
              LamCase  -> markLensFun an0 lepl_case (\ml -> mapM (\l -> printStringAtAA l "case") ml)
              LamCases -> markLensFun an0 lepl_case (\ml -> mapM (\l -> printStringAtAA l "cases") ml)
-    mg' <- markAnnotated mg
+    mg' <- setLayoutBoth $ markAnnotated mg
     return (HsLam an1 lam_variant mg')
 
   exact (HsApp an e1 e2) = do
@@ -3606,7 +3606,7 @@
           (c', w', vb', fds', lclas', tyvars',context') <- top_matter
           oc' <- markEpToken oc
           semis' <- mapM markEpToken semis
-          (sortKey', ds) <- withSortKey sortKey
+          (sortKey', ds) <- setLayoutBoth $ withSortKey sortKey
                                [(ClsSigTag, prepareListAnnotationA sigs),
                                 (ClsMethodTag, prepareListAnnotationA methods),
                                 (ClsAtTag, prepareListAnnotationA ats),
diff --git a/tests/Test/Transform.hs b/tests/Test/Transform.hs
--- a/tests/Test/Transform.hs
+++ b/tests/Test/Transform.hs
@@ -21,6 +21,7 @@
 
 import System.FilePath
 import Data.List
+import Data.List.NonEmpty (NonEmpty ((:|)))
 
 import Test.Common
 
@@ -62,6 +63,7 @@
   , mkTestModChange libdir changeLocalDecls2 "LocalDecls2.hs"
   , mkTestModChange libdir changeWhereIn3a   "WhereIn3a.hs"
   , mkTestModChange libdir changeWhereIn3b   "WhereIn3b.hs"
+  , mkTestModChange libdir changeInstanceGraft "InstanceGraft.hs"
 --  , mkTestModChange changeCifToCase  "C.hs"          "C"
   ]
 
@@ -99,6 +101,26 @@
   debugM $ "changeWhereIn3a:de1:" ++ showAst de1
   let p2 = p { hsmodDecls = decls}
   return (L l p2)
+
+-- ---------------------------------------------------------------------
+
+-- | A delta-anchored expression grafted into a class or instance method
+-- must indent its continuation lines relative to the method declarations
+-- layout column.
+changeInstanceGraft :: Changer
+changeInstanceGraft _libdir top = do
+  let lp = makeDeltaAst top
+      grab :: HsBind GhcPs -> [LHsExpr GhcPs]
+      grab FunBind{ fun_id = L _ n
+                  , fun_matches = MG{mg_alts = L _ [L _ Match{m_grhss = GRHSs _ (L _ (GRHS _ _ e) :| []) _}]}}
+        | occNameString (rdrNameOcc n) == "combine" = [e]
+      grab _ = []
+      [body] = everything (++) ([] `mkQ` grab) lp
+      replace :: LHsExpr GhcPs -> LHsExpr GhcPs
+      replace (L _ (HsVar _ (L _ n)))
+        | occNameString (rdrNameOcc n) == "todo" = setEntryDP body (SameLine 1)
+      replace x = x
+  return (everywhere (mkT replace) lp)
 
 -- ---------------------------------------------------------------------
 
diff --git a/tests/examples/transform/InstanceGraft.hs b/tests/examples/transform/InstanceGraft.hs
new file mode 100644
--- /dev/null
+++ b/tests/examples/transform/InstanceGraft.hs
@@ -0,0 +1,12 @@
+module InstanceGraft where
+
+combine :: Int -> Int -> Int
+combine a b = a
+  + b
+
+class C t where
+  go :: t -> Int
+  go n = todo
+
+instance C Int where
+  go n = todo
diff --git a/tests/examples/transform/InstanceGraft.hs.expected b/tests/examples/transform/InstanceGraft.hs.expected
new file mode 100644
--- /dev/null
+++ b/tests/examples/transform/InstanceGraft.hs.expected
@@ -0,0 +1,14 @@
+module InstanceGraft where
+
+combine :: Int -> Int -> Int
+combine a b = a
+  + b
+
+class C t where
+  go :: t -> Int
+  go n = a
+    + b
+
+instance C Int where
+  go n = a
+    + b
