diff --git a/theories/infinite.v b/theories/infinite.v
index 325750648917027a9ca00822fd4e52c2a080d922..ecd3d501e4ee470474845370cf98f991fa66ed95 100644
--- a/theories/infinite.v
+++ b/theories/infinite.v
@@ -11,17 +11,27 @@ Class Infinite A := {
   inject_injective :> Inj (=) (=) inject;
 }.
 
+(** Instances *)
+Program Definition inj_infinite `{Infinite A} {B} (f : A → B) `{!Inj (=) (=) f} :
+  Infinite B := {| inject := f ∘ inject |}.
+
 Instance string_infinite: Infinite string := {| inject := λ x, "~" +:+ pretty x |}.
 Instance nat_infinite: Infinite nat := {| inject := id |}.
 Instance N_infinite: Infinite N := {| inject_injective := Nat2N.inj |}.
 Instance positive_infinite: Infinite positive := {| inject_injective := SuccNat2Pos.inj |}.
 Instance Z_infinite: Infinite Z := {| inject_injective := Nat2Z.inj |}.
 
-Instance option_infinite `{Infinite A}: Infinite (option A) := {| inject := Some ∘ inject |}.
+Instance option_infinite `{Infinite A} : Infinite (option A) := inj_infinite Some.
+Instance sum_infinite_l `{Infinite A} {B} : Infinite (A + B) := inj_infinite inl.
+Instance sum_infinite_r {A} `{Infinite B} : Infinite (A + B) := inj_infinite inr.
+Instance prod_infinite_l `{Infinite A, Inhabited B} : Infinite (A * B) :=
+  inj_infinite (,inhabitant).
+Instance prod_infinite_r `{Inhabited A, Infinite B} : Infinite (A * B) :=
+  inj_infinite (inhabitant,).
+
 Program Instance list_infinite `{Inhabited A}: Infinite (list A) :=
   {| inject := λ i, replicate i inhabitant |}.
 Next Obligation.
-Proof.
   intros A * i j Heqrep%(f_equal length).
   rewrite !replicate_length in Heqrep; done.
 Qed.