Faits :
A.
A.a. A._, né en 1966, ressortissant étranger, réside dans le canton de Genève depuis le 18 octobre 2000 au bénéfice d'un permis B pour formation. Il est inscrit en tant qu'étudiant régulier à l'Université de V._. Souhaitant conclure un contrat d'assurance-maladie et accidents à compter du 1 er avril 2013, il a pris contact avec CSS Assurance-maladie SA (ci-après: CSS Assurance) qui, le 7 février 2013, lui a adressé une proposition d'assurance Student Care relevant de la loi fédérale sur le contrat d'assurance (LCA). Le 16 mars 2013, A._ a fait savoir à CSS Assurance que la proposition concernait une assurance complémentaire et qu'il souhaitait prendre une assurance de base dès le 1 er avril 2013. Le 28 mars 2013, il a signé la proposition d'assurance Student Care avec effet au 1 er avril 2013, choisissant la prime de 179 fr. 60 avec une franchise de 500 francs. Une police d'assurance LCA a ainsi été établie sur cette base, le 6 avril 2013. L'assuré s'est acquitté des primes des mois d'avril et mai 2013.
Par lettre du 6 mars 2013, le Service de l'assurance-maladie du canton de Genève (le SAM) a informé A._ qu'il avait procédé à son affiliation d'office auprès de B._ SA à compter du 1 er mars 2013. Le 2 juillet 2013, le SAM a attiré l'attention de A._ sur le fait que l'assurance Student Care ne figurait pas sur la liste des assureurs maladie admis en Suisse; en outre, il résidait depuis plus de six ans en Suisse et n'entrait donc plus dans les catégories de personnes pouvant bénéficier d'une dispense à l'assurance obligatoire des soins. Le SAM l'a invité à conclure un contrat avec un assureur suisse dont la couverture devait débuter au plus tard le 1 er mars 2013, afin que son affiliation d'office puisse être annulée. Par décision du 22 juillet 2013, le SAM a dispensé A._ de l'obligation d'assurance du 1 er décembre 2002 au 31 mars 2013, car il avait bénéficié dans cet intervalle d'une couverture d'assurance maladie et accidents équivalente aux exigences posées par l'OAMal. B._ SA a confirmé qu'elle annulait son contrat, le 28 juillet 2013.
Le 6 juillet 2013, CSS Assurance a établi une police d'assurance soumise à la LAMal, Assurance Cabinets de santé (LAMal), valable dès le 1 er avril 2013. Une nouvelle police, établie le 3 août 2013, a avancé la validité de l'affiliation au 1 er mars 2013, ce que CSS Assurance a confirmé au SAM par lettre du 2 août 2013. Elle a remboursé les montants versés après avoir annulé le contrat Student Care, le 3 juin 2013.
A.b. A._ ne s'est pas acquitté des primes d'assurance LAMal, si bien que CSS Assurance lui a fait notifier trois commandements de payer. La poursuite n° xxx portait sur les primes LAMal restées impayées de mars à novembre 2013, soit 2'335 fr. 05. La deuxième poursuite n° yyy concernait les primes LAMal impayées de décembre 2013 à février 2014, pour un montant de 786 fr. 15. Quant à la troisième poursuite n° zzz, elle portait sur les primes LAMal impayées de mars à mai 2014, soit 790 fr. 05. Chaque poursuite comportait en outre des frais administratifs et des intérêts.
Par décisions des 23 juin, 25 août et 1 er décembre 2014, CSS Assurance a levé les oppositions qui avaient été formées contre les commandements de payer. L'assuré s'est opposé à ces décisions.
Dans une décision sur opposition du 29 septembre 2014, CSS Assurance a joint les causes relatives aux poursuites n° xxx et yyy, admis très partiellement l'opposition, en ce sens que le début de l'assurance obligatoire des soins a été reporté au 1 er avril 2013. Le montant réclamé s'est élevé à 2'861 fr. 75, augmenté des frais administratifs par 200 fr., des intérêts et frais de poursuite.
Dans une seconde décision sur opposition du 20 janvier 2015, CSS Assurance a prononcé la mainlevée de la poursuite n° zzz à hauteur de 690 fr. 05, augmenté des frais administratifs par 100 fr., des intérêts et des frais de poursuite.
B.
A._ a déféré la décision sur opposition du 29 septembre 2014 à la Cour de justice de la République et canton de Genève, Chambre des assurances sociales, en concluant à son annulation, ainsi qu'à la condamnation de l'assureur à lui payer un dédommagement de 2'990 fr. pour préjudice subi, ainsi qu'au paiement de la somme de 500 fr. pour frais administratifs.
Il a également recouru contre la décision sur opposition du 20 janvier 2015, en concluant à son annulation et à ce que la nullité de la police du 3 août 2013 fût constatée.
La juridiction cantonale a joint les deux causes. Par jugement du 21 avril 2015, elle a rejeté les recours et confirmé les décisions sur opposition des 29 septembre 2014 et 20 janvier 2015.
C.
A._ interjette un recours en matière de droit public contre ce jugement dont il demande l'annulation. Il invite le Tribunal fédéral à dire qu'il n'a pas été valablement affilié auprès de CSS Assurance et que le SAM doit procéder à une nouvelle affiliation d'office, la cause étant renvoyée aux premiers juges à cet effet. Il a déposé une écriture complémentaire le 21 décembre 2015.

Considérant en droit :
1.
Comme en première instance, le litige porte sur le point de savoir si le recourant a été valablement affilié auprès de CSS Assurance pour l'assurance obligatoire des soins à compter du 1 er avril 2013 et, partant, de déterminer si cet assureur était en droit de lever les oppositions formées contre trois commandements de payer (poursuites n os xxx, yyy et zzz).
2.
Les premiers juges ont exposé correctement les règles applicables à la solution du litige, singulièrement celles qui se rapportent à l'obligation de s'assurer et de payer les primes d'assurance. Il suffit d'y renvoyer.
3.
Le recourant se prévaut d'une appréciation arbitraire des faits et d'une violation du droit fédéral. A son avis, les juges cantonaux ont omis de constater que CSS Assurance s'était substituée à Student Care qui avait établi la police d'assurance contestée. Il leur reproche de ne pas avoir écarté la motivation de la décision du 29 septembre 2014. Il estime que la juridiction cantonale a reconnu le droit de Student Care de procéder à l'affiliation d'office de personnes, rendant sans objet les ordres donnés par le SAM.
Par ailleurs, le recourant soutient qu'il n'a pas pu exercer son libre choix de l'assureur et que l'intimée n'était pas en droit de l'affilier d'office. Il fait grief aux juges cantonaux de ne pas avoir tenu compte d'une erreur essentielle, au sens de l'<ref-law>, qui avait abouti à l'annulation du contrat d'assurance conclu avec Student Care. Implicitement, il reproche à la juridiction cantonale d'admettre que l'intimée puisse se prévaloir de sa propre erreur pour convertir un contrat relevant de la LCA, au demeurant résolu, en un contrat soumis à la LAMal, de surcroît au mépris du principe de son libre consentement.
4.
Student Care n'est pas un assureur-maladie et accidents, mais un produit d'assurance proposé par CSS Assurance. Il ne s'agit pas d'une assurance complémentaire à l'assurance obligatoire des soins, mais d'une assurance indépendante de celle-ci, soumise à la LCA. Les prestations sont identiques à celles de l'assurance obligatoire des soins; l'assurance peut être conclue par des personnes domiciliées à l'étranger, en formation en Suisse, qui ne sont pas soumises à l'obligation de s'assurer en Suisse selon la LAMal (cf. Conditions complémentaires relatives au produit Student Care, éd. 01.2010, ch. 1 et 2). Dépourvu de qualité d'assureur et de personnalité juridique, Student Care n'est donc pas habilité à procéder à l'affiliation de personnes à l'assurance obligatoire des soins ou à conclure un contrat d'assurance. Contrairement à ce que soutient le recourant, il n'y a dès lors pas eu (ni pu avoir) de substitution de partie entre CSS Assurance et Student Care.
En signant la proposition du 28 mars 2013, le recourant avait accepté les Conditions complémentaires relatives au produit Student Care, éd. 01.2010, ch. 10.4, qui prévoyaient un passage automatique dans l'assurance obligatoire des soins (de CSS Assurance) à la fin du mois au cours duquel l'assurance privée se termine, lorsque l'assuré reste en Suisse. Dans la mesure où CSS Assurance a annulé la police d'assurance Student Care et remboursé les primes, on pourrait se demander si les parties étaient encore liées par le ch. 10.4 des conditions complémentaires (passage automatique dans l'assurance obligatoire des soins de CSS Assurance). Cette question peut rester indécise car dans un courriel du 8 septembre 2013, le recourant ne s'est pas opposé au principe de son affiliation auprès de CSS Assurance pour l'assurance obligatoire des soins, objet des polices d'assurance des 6 juillet 2013 et 3 août 2013, mais il a demandé que le début de cette assurance fût reporté du 1 er mars au 1 er avril 2013. Il avait du reste fait savoir à CSS Assurance, le 16 mars 2013, qu'il souhaitait prendre une assurance de base dès le 1 er avril 2013. Par actes concluants, le recourant a donc confirmé sa volonté d'être affilié auprès de cet assureur pour l'assurance obligatoire des soins à partir du 1 er avril 2013. L'intimée a d'ailleurs finalement fait droit à cette requête, lorsqu'elle a admis partiellement l'opposition dans sa décision du 29 septembre 2014 (cf. consid. 3.16, p. 4).
Il importe donc peu de savoir si l'on s'est trouvé ou non en présence de la conversion d'un produit soumis à la LCA en une assurance relevant de la LAMal, car le recourant a exercé librement son choix de l'assureur pratiquant l'assurance obligatoire des soins et ce dernier l'a accueilli en qualité d'assuré conformément à la loi. Quant au grief tiré de l'existence d'une erreur, au sens de l'<ref-law>, il n'est pas fondé, car en définitive le recourant a toujours obtenu les polices d'assurance qu'il avait demandées.
Pour le surplus, le montant des primes en souffrance ainsi que le principe de leur recouvrement ne sont pas contestés en tant que tels. Mal fondé, le recours sera rejeté, sans qu'il soit nécessaire de procéder à l'échange d'écritures sollicité par le recourant.
5.
Le recourant, qui succombe, supportera les frais de la procédure (<ref-law>).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 600 fr., sont mis à la charge du recourant.
3.
Le présent arrêt est communiqué aux parties, à la Cour de justice de la République et canton de Genève, Chambre des assurances sociales, et à l'Office fédéral de la santé publique.
Lucerne, le 2 février 2016
Au nom de la IIe Cour de droit social
du Tribunal fédéral suisse
Le Juge présidant : Meyer
Le Greffier : Berthoud