std_logic_vector IS a standard type. But it was not meant to be used as a number - its just a collection of bits.
Because so many people in the late 80s and very early 90s wanted to do arithmatic, synopsys wrote some libraries of its own to do arithmatic with std_logic_vectors - the std_logic_unsigned/signed package. It also (probably later) realised that this went against the idea of strong typing, and so created the std_logic_arith package that defines unsigned and signed types. To make life easy for themselves, but technically break the rules, they compiles the packages into the IEEE library.
the IEEE cottoned on and in 1993 numeric_std became a standard library in VHDL. The problem was that synopsys had distributed their code to vendors (or they had written their own versions of the packages) and engineers had learned to use these non-standard packages (so technically now a defacto standard). The fact that tools didnt support numeric_std for a while didnt help either. Neither did the third fact there were many text books teaching the use of std_logic_unsinged/signed/arith, and this problem still persists OVER 20 YEARS since numeric_std was standardised.