Очень простой ответ из личного опыта состоит в том, что Enums обеспечивают гораздо лучшую безопасность типов, или, другими словами, компилятор играет более активную роль в обеспечении безопасности вашего кода.
С другой стороны, поскольку Enums являются "гражданами второго сорта" в объектном мире, их может быть сложно использовать в некоторых из более тонких шаблонов проектирования, обычно используемых сегодня, особенно когда используются дженерики.
И, наконец, вы можете использовать статические финальные целые в битовом поле. Вы не можете сделать следующее с перечислением:
int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;