--- Quote Start ---
To me this means that it would be impossible for me to count higher than 11, but for some reason the counter actually goes up to 15 before wrapping around. Any idea why?
--- Quote End ---
You're expecting Quartus to implement a modulo 12 counter without specifying it. You simply shouldn't do that.
What do you expect, if you assign a STD_LOGIC_VECTOR of "1111" to the integer signal? The FPGA throwing an exception? Performing a modulo operation? Saturation?
In my opinion, integer is an abstract data type, that is converted to synthesizable SIGNED/UNSIGNED types according to the range definition. But no additional code is involved. You get a more convenient VHDL syntax, e.g. you can write
count <= 3; instead of
count <= conv_unsigned(3,4); But the implemented behaviour is still
unsigned(3 downto 0);