Integer is an abstract type, that can't be used in sythesized logic without specifying a range. In any case, the underlying bit_vector is hidden, so you can't access the individual bits. A range constrainted integer is an elegant method to implement e.g. a counter. But the basic type to be used for arithmetics is signed or unsigned. Also when converting std_logic_vector to integer, you have to convert to signed or unsigned before to clarify the sign (unless you're using one of the "lazy engineer's" signed/unsigned libraries).