diff --git a/theories/finite.v b/theories/finite.v
index 0afae8a17b03f287a6645c21d8523dc28c63082d..4297363d0e5a5fed5b30c20756e270dd33c3ad88 100644
--- a/theories/finite.v
+++ b/theories/finite.v
@@ -220,15 +220,25 @@ Section enc_finite.
   Proof. unfold card. simpl. by rewrite fmap_length, seq_length. Qed.
 End enc_finite.
 
+Section surjective_finite.
+  Context `{Finite A, EqDecision B} (f : A → B).
+  Context `{!Surj (=) f}.
+
+  Program Instance surjective_finite: Finite B := {| enum := remove_dups (f <$> enum A) |}.
+  Next Obligation. apply NoDup_remove_dups. Qed.
+  Next Obligation.
+    intros y. rewrite elem_of_remove_dups, elem_of_list_fmap.
+    destruct (Surj0 y). eauto using elem_of_enum.
+  Qed.
+End surjective_finite.
+
 Section bijective_finite.
   Context `{Finite A, EqDecision B} (f : A → B) (g : B → A).
   Context `{!Inj (=) (=) f, !Cancel (=) f g}.
 
-  Program Instance bijective_finite: Finite B := {| enum := f <$> enum A |}.
-  Next Obligation. apply (NoDup_fmap_2 _), NoDup_enum. Qed.
-  Next Obligation.
-    intros y. rewrite elem_of_list_fmap. eauto using elem_of_enum.
-  Qed.
+  Program Instance bijective_finite: Finite B := _.
+  Next Obligation. eapply surjective_finite. eapply cancel_surj.
+                   Unshelve. all: eapply _. Qed.
 End bijective_finite.
 
 Program Instance option_finite `{Finite A} : Finite (option A) :=