diff --git a/theories/algebra/excl.v b/theories/algebra/excl.v
index 6b4655ec240e9aa9e6e5c1219c75c545e67d0cb8..eca64bb1815d8806b7e0cda999079709569da7de 100644
--- a/theories/algebra/excl.v
+++ b/theories/algebra/excl.v
@@ -54,8 +54,9 @@ Canonical Structure exclC : ofeT := OfeT (excl A) excl_ofe_mixin.
 
 Global Instance excl_cofe `{Cofe A} : Cofe exclC.
 Proof.
-  apply (iso_cofe (from_option Excl ExclBot) (maybe Excl));
-    [by destruct 1; constructor..|by intros []; constructor].
+  apply (iso_cofe (from_option Excl ExclBot) (maybe Excl)).
+  - by intros n [a|] [b|]; split; inversion_clear 1; constructor.
+  - by intros []; constructor.
 Qed.
 
 Global Instance excl_discrete : Discrete A → Discrete exclC.
diff --git a/theories/algebra/ofe.v b/theories/algebra/ofe.v
index 3d42d6f3f2bb062003a4e07a2c3dee45b950ec93..f374a62eec5dc02964b340e20cad5928f3a04c01 100644
--- a/theories/algebra/ofe.v
+++ b/theories/algebra/ofe.v
@@ -553,26 +553,6 @@ Section unit.
   Proof. done. Qed.
 End unit.
 
-Lemma iso_ofe_mixin {A : ofeT} `{Equiv B, Dist B} (g : B → A)
-  (g_equiv : ∀ y1 y2, y1 ≡ y2 ↔ g y1 ≡ g y2)
-  (g_dist : ∀ n y1 y2, y1 ≡{n}≡ y2 ↔ g y1 ≡{n}≡ g y2) : OfeMixin B.
-Proof.
-  split.
-  - intros y1 y2. rewrite g_equiv. setoid_rewrite g_dist. apply equiv_dist.
-  - split.
-    + intros y. by apply g_dist.
-    + intros y1 y2. by rewrite !g_dist.
-    + intros y1 y2 y3. rewrite !g_dist. intros ??; etrans; eauto.
-  - intros n y1 y2. rewrite !g_dist. apply dist_S.
-Qed.
-
-Program Definition iso_cofe {A B : ofeT} `{Cofe A} (f : A → B) (g : B → A)
-    `(!NonExpansive g, !NonExpansive f) (fg : ∀ y, f (g y) ≡ y) : Cofe B :=
-  {| compl c := f (compl (chain_map g c)) |}.
-Next Obligation.
-  intros A B ? f g ?? fg n c. by rewrite /= conv_compl /= fg.
-Qed.
-
 (** Product *)
 Section product.
   Context {A B : ofeT}.
@@ -1071,7 +1051,7 @@ Proof.
   destruct n as [|n]; simpl in *; first done. apply cFunctor_ne, Hfg.
 Qed.
 
-(** Sigma *)
+(** Limit preserving predicates *)
 Class LimitPreserving `{!Cofe A} (P : A → Prop) : Prop :=
   limit_preserving (c : chain A) : (∀ n, P (c n)) → P (compl c).
 Hint Mode LimitPreserving + + ! : typeclass_instances.
@@ -1098,6 +1078,43 @@ Section limit_preserving.
   Qed.
 End limit_preserving.
 
+(** Constructing isomorphic OFEs *)
+Lemma iso_ofe_mixin {A : ofeT} `{Equiv B, Dist B} (g : B → A)
+  (g_equiv : ∀ y1 y2, y1 ≡ y2 ↔ g y1 ≡ g y2)
+  (g_dist : ∀ n y1 y2, y1 ≡{n}≡ y2 ↔ g y1 ≡{n}≡ g y2) : OfeMixin B.
+Proof.
+  split.
+  - intros y1 y2. rewrite g_equiv. setoid_rewrite g_dist. apply equiv_dist.
+  - split.
+    + intros y. by apply g_dist.
+    + intros y1 y2. by rewrite !g_dist.
+    + intros y1 y2 y3. rewrite !g_dist. intros ??; etrans; eauto.
+  - intros n y1 y2. rewrite !g_dist. apply dist_S.
+Qed.
+
+Program Definition iso_cofe_subtype {A B : ofeT} `{Cofe A}
+    (P : A → Prop) `{!LimitPreserving P}
+    (f : ∀ x, P x → B) (g : B → A)
+    (Pg : ∀ y, P (g y))
+    (g_dist : ∀ n y1 y2, y1 ≡{n}≡ y2 ↔ g y1 ≡{n}≡ g y2)
+    (gf : ∀ x Hx, g (f x Hx) ≡ x) : Cofe B :=
+  let _ : NonExpansive g := _ in
+  {| compl c := f (compl (chain_map g c)) _ |}.
+Next Obligation. intros A B ? P _ f g _ g_dist _ n y1 y2. apply g_dist. Qed.
+Next Obligation.
+  intros A B ? P ? f g ? g_dist gf ? c. apply limit_preserving=> n. apply Pg.
+Qed.
+Next Obligation.
+  intros A B ? P ? f g ? g_dist gf ? n c; simpl.
+  apply g_dist. by rewrite gf conv_compl.
+Qed.
+
+Definition iso_cofe {A B : ofeT} `{Cofe A} (f : A → B) (g : B → A)
+  (g_dist : ∀ n y1 y2, y1 ≡{n}≡ y2 ↔ g y1 ≡{n}≡ g y2)
+  (gf : ∀ x, g (f x) ≡ x) : Cofe B.
+Proof. by apply (iso_cofe_subtype (λ _, True) (λ x _, f x) g). Qed.
+
+(** Sigma *)
 Section sigma.
   Context {A : ofeT} {P : A → Prop}.
   Implicit Types x : sig P.
@@ -1120,16 +1137,8 @@ Section sigma.
   Proof. by apply (iso_ofe_mixin proj1_sig). Qed.
   Canonical Structure sigC : ofeT := OfeT (sig P) sig_ofe_mixin.
 
-  (* FIXME: WTF, it seems that within these braces {...} the ofe argument of LimitPreserving
-     suddenly becomes explicit...? *)
-  Program Definition sig_compl `{LimitPreserving _ P} : Compl sigC :=
-    λ c, exist P (compl (chain_map proj1_sig c)) _.
-  Next Obligation. intros ? Hlim c. apply Hlim=> n /=. by destruct (c n). Qed.
-  Program Definition sig_cofe `{Cofe A, !LimitPreserving P} : Cofe sigC :=
-    {| compl := sig_compl |}.
-  Next Obligation.
-    intros ?? n c. apply (conv_compl n (chain_map proj1_sig c)).
-  Qed.
+  Global Instance sig_cofe `{Cofe A, !LimitPreserving P} : Cofe sigC.
+  Proof. by apply (iso_cofe_subtype P (exist P) proj1_sig proj2_sig). Qed.
 
   Global Instance sig_timeless (x : sig P) :  Timeless (`x) → Timeless x.
   Proof. intros ? y. rewrite sig_dist_alt sig_equiv_alt. apply (timeless _). Qed.