The main problem with using arithmetic on std_logic_vectors, is that you don't know at first glance when reading the code if you are dealing with signed or unsigned numbers. Sure for know you know what you wrote, but your code could end up copy/pasted in another file, where std_logic_vectors are supposed to be unsigned instead, or you could even have to deal with unsigned and signed values in the same code. Using the unsigned and signed types wakes the code more readable, more reusable and can reduce mistakes.
As for the binary numbers, even if real arithmetic operations aren't synthesizable, you can still use real constants in your code. Something like:
--- Quote Start ---
constant MyNum : integer := integer(0.85*(2**22));
--- Quote End ---
Or if using vectors and declaring more constants, something like (assuming you are using 23 bit signed numbers, to have a scaling factor of 2^22):
--- Quote Start ---
constant VectorsSize : natural := 23;
constant ScalingFactor : real := real(2**(VectorsSize-1));
constant MyVector : signed := to_signed(integer(0.85*ScalingFactor),VectorsSize);
--- Quote End ---
If you need to do a lot of conversions, you could also define a function to do that instead.
There is also a new fixed point library in VHDL, but I haven't tried it yet.