On pourrait citer la performance vu que dans la plupart des implémentations, comparer 2 enums pour savoir s'ils sont égaux équivaut grosso-modo à comparer 2 int ou 2 adresses. Or pour les chaînes il faut bien plus de tests.
Mais le plus gros gain est au niveau lisibilité.
1) En regardant un enum, tu repères tout de suite toutes les valeurs possibles alors qu'un string ça peut contenir n'importe quoi à n'importe quel moment.
2) Tu profites du processus de compilation qui détecte toute éventuelle erreur de case ou de typo. Tu orthographies mal ta chaîne, tu as une anomalie à l'exécution.
Ca peut paraître rien, mais avoir un maximum de choses formellement définies et vérifiées à la compilation, c'est un signe fort de qualité logicielle.
Il faut toujours imaginer que ces petites choses paraissent superflues lorsqu'on est en plein dans son code, mais sitôt qu'on doit y revenir 6 mois après faire des modifs, on a vite fait de faire une petite coquille en vitesse, souvent on ne reteste pas tout à 100% et c'est goal.