I believe that what you're looking for is some data structure `Vector` which has some list defining direction and some scalar which in part defines magnitude.

Here you go:

    Vector[a_List] := Vector[1, a]
    Vector[b_, _]["scalar"] := b
    Vector[_, a_List]["vector"] := a
    Vector /: (b_ Vector[c_, a_List]) := Vector[c b, a]
    a = 3 Vector[{1, 1, 0}];
    b = 2 Vector[.3, {3, 2, 0}];
If you want to "extract" the scalars, then use `magicfunction`:

    magicfunction[a__Vector, z_] := 
       Times @@ (#["scalar"] &) /@ List[a] z @@ (#["vector"] &) /@ List[a]
For instance:

    magicfunction[a, b, Cross]
    (* {0., 0., -1.8} *)
    magicfunction[a, b, Hold]
    (* 1.8 Hold[{1, 1, 0}, {3, 2, 0}] *)
In order to get the regular vector back, just use `Normal`.  Make sure you have a copy of your `Vector`, however, as this transformation will lose the information about the scalar.

    Vector /: Normal[Vector[b_, a_List]] := b a
    Normal[a]
    (* {3, 3, 0} *)