The std_logic/std_logic_vector only rule is an old one. Years ago, at the beginning of synthesisors that understood VHDL, They would only accept std_logic/std_logic_vectors as ports. Because this used to be a rule, it has stuck around like a bad smell and many people still preach this even though support for signed/unsigned/integer/anything came around a long time ago.
As a general rule, stick with an array type at the top level (or any type where you can actually map the bits to individual pins, even record types as long as the internal types can all map to bits) but underneath that, feel free to go mad and use whatever you want. Std_logic, boolean, integer, signed, ufixed, state_type etc etc. It makes coding much much easier when you dont have to do type conversions in every single file!
As an asside, I hope you're refering to signed/unsigned from numeric_std, not from std_logic_arith. std_logic_arith/signed/unsigned are other parts of VHDL that refuse to die.