This is most likely not a new discovery, but I just realized you can effectively store non-isbits data in type parameters. MWE:
julia> struct Value{T} end
julia> Value(x) = Value{Symbol(repr(x))}();
julia> unwrap(::Value{sym}) where {sym} = eval(Meta.parse(string(sym)));
julia> v = Value([1, 2])
Value{Symbol("[1, 2]")}()
julia> unwrap(v)
2-element Vector{Int64}:
1
2
julia> ValueType(x) = Value{Symbol(repr(x))};
julia> foo(::ValueType([1, 2])) = 42;
julia> foo(v)
42
So, if you ever wanted to dispatch on non-isbits values, now you can. Use wisely.