diff --git a/theories/base_logic/upred.v b/theories/base_logic/upred.v
index 52ac2d274ef5a1939aa29c26e9b0d77db7d611e8..eec44f42d1184a029f0f7ac427ddabe77e43f49f 100644
--- a/theories/base_logic/upred.v
+++ b/theories/base_logic/upred.v
@@ -8,7 +8,26 @@ Set Default Proof Using "Type".
 
 Record uPred (M : ucmraT) : Type := IProp {
   uPred_holds :> nat → M → Prop;
+
+  (* [uPred_mono] is used to prove non-expansiveness (guaranteed by
+     [uPred_ne]). Therefore, it is important that we do not restrict
+     it to only valid elements. *)
   uPred_mono n x1 x2 : uPred_holds n x1 → x1 ≼{n} x2 → uPred_holds n x2;
+
+  (* We have to restrict this to hold only for valid elements,
+     otherwise this condition is no longer limit preserving, and uPred
+     does no longer form a COFE (i.e., [uPred_compl] breaks). This is
+     because the distance and equivalence on this cofe ignores the
+     truth valid on invalid elements. This, in turns, is required by
+     the fact that entailment has to ignore invalid elements, which is
+     itself essential for proving [ownM_valid].
+
+     We could, actually, make the following condition true even for
+     invalid elements: we have proved that uPred is isomorphic to a
+     sub-COFE of the COFE of predicates that are monotonous both with
+     respect to the step index and with respect to x. However, that
+     would essentially require changing (by making more complicated)
+     the model of many connectives of the logic, which we don't want. *)
   uPred_closed n1 n2 x : uPred_holds n1 x → n2 ≤ n1 → ✓{n2} x → uPred_holds n2 x
 }.
 Arguments uPred_holds {_} _ _ _ : simpl never.