diff --git a/iris/base_logic/lib/fancy_updates.v b/iris/base_logic/lib/fancy_updates.v
index b9ba2d8a4434f4d7dd70005e90b9891d3a19e106..f836b8aef9368da518ca9b820956c79c5368d5be 100644
--- a/iris/base_logic/lib/fancy_updates.v
+++ b/iris/base_logic/lib/fancy_updates.v
@@ -116,7 +116,8 @@ Lemma fupd_plain_soundness_no_lc `{!invGpreS Σ} E1 E2 (P: iProp Σ) `{!Plain P}
   (∀ `{Hinv: !invGS Σ} `{!HasNoLc Σ}, ⊢ |={E1,E2}=> P) → ⊢ P.
 Proof.
   iIntros (Hfupd). apply later_soundness. iMod wsat_alloc as (Hw) "[Hw HE]".
-  iMod (lc_alloc 0) as (Hc) "[_ _]".
+  (* We don't actually want any credits, but we need the [lcGS]. *)
+  iMod (later_credits.le_upd.lc_alloc 0) as (Hc) "[_ _]".
   set (Hi := InvG _ Hw Hc false).
   iAssert (|={⊤,E2}=> P)%I as "H".
   { iMod (fupd_mask_subseteq E1) as "_"; first done. iApply Hfupd. by constructor. }
diff --git a/iris/base_logic/lib/later_credits.v b/iris/base_logic/lib/later_credits.v
index 4885a108ef05a4bb1544ea05dffef5f21c053ad0..acd0190cfc8c6f8777034ec77f3ee2f7a40f6772 100644
--- a/iris/base_logic/lib/later_credits.v
+++ b/iris/base_logic/lib/later_credits.v
@@ -213,6 +213,14 @@ Module le_upd.
       intros Hent. iApply le_upd_bind.
       iIntros "P"; iApply le_upd_intro; by iApply Hent.
     Qed.
+
+    Global Instance le_upd_mono' : Proper ((⊢) ==> (⊢)) le_upd.
+    Proof. intros P Q PQ; by apply le_upd_mono. Qed.
+    Global Instance le_upd_flip_mono' : Proper (flip (⊢) ==> flip (⊢)) le_upd.
+    Proof. intros P Q PQ; by apply le_upd_mono. Qed.
+    Global Instance le_upd_equiv_proper : Proper ((≡) ==> (≡)) le_upd.
+    Proof. apply ne_proper. apply _. Qed.
+
     Lemma le_upd_trans P :  (|==£> |==£> P) -∗ |==£> P.
     Proof.
       iIntros "HP". iApply le_upd_bind; eauto.
@@ -222,6 +230,8 @@ Module le_upd.
       iIntros "[Hupd R]". iApply (le_upd_bind with "[R]"); last done.
       iIntros "P". iApply le_upd_intro. by iFrame.
     Qed.
+    Lemma le_upd_frame_l P R : R ∗ (|==£> P) -∗ |==£> R ∗ P.
+    Proof. rewrite comm le_upd_frame_r comm //. Qed.
 
     Lemma le_upd_later P :
       £ 1 -∗ ▷ P -∗ |==£> P.
@@ -230,12 +240,11 @@ Module le_upd.
       iNext. by iApply le_upd_intro.
     Qed.
 
-    Global Instance le_upd_mono' : Proper ((⊢) ==> (⊢)) le_upd.
-    Proof. intros P Q PQ; by apply le_upd_mono. Qed.
-    Global Instance le_upd_flip_mono' : Proper (flip (⊢) ==> flip (⊢)) le_upd.
-    Proof. intros P Q PQ; by apply le_upd_mono. Qed.
-    Global Instance le_upd_equiv_proper : Proper ((≡) ==> (≡)) le_upd.
-    Proof. apply ne_proper. apply _. Qed.
+    Lemma except_0_le_upd P : ◇ (le_upd P) ⊢ le_upd (◇ P).
+    Proof.
+      rewrite /bi_except_0. apply or_elim; eauto using le_upd_mono, or_intro_r.
+      by rewrite -le_upd_intro -or_intro_l.
+    Qed.
 
     (** A safety check that later-elimination updates can replace basic updates *)
     (** We do not use this to build an instance, because it would conflict
@@ -291,9 +300,52 @@ Module le_upd.
       iIntros "Hupd". iMod "Hupd". iModIntro. iMod "Hupd".
       iNext. iDestruct "Hupd" as "[%m (_ & _ & $)]".
     Qed.
+
+    (** Proof mode class instances internally needed for people defining their
+    [fupd] with [le_upd]. *)
+    Global Instance elim_bupd_le_upd p P Q :
+      ElimModal True p false (bupd P) P (le_upd Q) (le_upd Q)%I.
+    Proof.
+      rewrite /ElimModal bi.intuitionistically_if_elim //=.
+      rewrite bupd_le_upd. iIntros "_ [HP HPQ]".
+      iApply (le_upd_bind with "HPQ HP").
+    Qed.
+
+    Global Instance from_assumption_le_upd p P Q :
+      FromAssumption p P Q → KnownRFromAssumption p P (le_upd Q).
+    Proof.
+      rewrite /KnownRFromAssumption /FromAssumption=>->. apply le_upd_intro.
+    Qed.
+
+    Global Instance from_pure_le_upd a P φ :
+      FromPure a P φ → FromPure a (le_upd P) φ.
+    Proof. rewrite /FromPure=> <-. apply le_upd_intro. Qed.
+
+    Global Instance is_except_0_le_upd P : IsExcept0 P → IsExcept0 (le_upd P).
+    Proof.
+      rewrite /IsExcept0=> HP.
+      by rewrite -{2}HP -(except_0_idemp P) -except_0_le_upd -(except_0_intro P).
+    Qed.
+
+    Global Instance from_modal_le_upd P :
+      FromModal True modality_id (le_upd P) (le_upd P) P.
+    Proof. by rewrite /FromModal /= -le_upd_intro. Qed.
+
+    Global Instance elim_modal_le_upd p P Q :
+      ElimModal True p false (le_upd P) P (le_upd Q) (le_upd Q).
+    Proof.
+      by rewrite /ElimModal
+        intuitionistically_if_elim le_upd_frame_r wand_elim_r le_upd_trans.
+    Qed.
+
+    Global Instance frame_le_upd p R P Q :
+      Frame p R P Q → Frame p R (le_upd P) (le_upd Q).
+    Proof. rewrite /Frame=><-. by rewrite le_upd_frame_l. Qed.
   End le_upd.
 
-  Lemma lc_alloc `{!lcGpreS Σ} n :
+  (** You probably do NOT want to use this lemma; use [lc_soundness] if you want
+  to actually use [le_upd]! *)
+  Local Lemma lc_alloc `{!lcGpreS Σ} n :
     ⊢ |==> ∃ _ : lcGS Σ, lc_supply n ∗ £ n.
   Proof.
     rewrite lc_unseal /lc_def lc_supply_unseal /lc_supply_def.