I assume you're doing value type identifiers for an additional layer of compile time assurance?
I sympathize, but I'll say that every time I've gone down that road, it seems to not be worth the effort. I occasionally catch barId being equated to fooId bugs, but it's pretty rare and tests and variable naming go a long way to sorting those out as well.
At any rate, one technique you could use is to set your value type id as another property and then have the Id be a read-only calculation.
pseudo:
class Foo
Foo(ValueType id){ FooId = id; }
ValueType FooId {get; private set; }
string Id { get { return ConvertToRavenId(FooId); } } //use method, ToString, implicit conversion, whatever
If you find yourself with a value type id needing to find a document in the db, add a static method to the document class that does the conversion and have the Id property rely on that as well.