Use enum when you want to create a new, distinct type which isn't really a scalar value. For example, colors can be enumerated, and hence numbered, but those numbers don't really mean anything.
If you're assigning meaningful numbers to the enumerators, it's a sign that you might really want something like this:
namespace GameProperty { // completely different concepts with unifying theme
int const num_tetrominoes = 7,
num_tiles = 4,
num_rotations = 4;
};
Now you can use the same syntax, as well as using declarations, and these constants work in for loops and expressions with no conversion.
For another example, the following are both correct but shouldn't be swapped between enum and int:
namespace wavelengths { // closely related quantities
typedef int wavelength_t; // maybe we will express in-between values
wavelength_t const red = 750,
green = 550,
blue = 400;
};
enum colors { // qualitatively different but related as one-of-many
red,
green,
blue;
};