That decision is made by .NET Framework code and not WSCF.blue. It is hard to know what the original thinking behind some of these design decisions was.
I generally stick the most simplistic types that I can get away with when creating my own contracts. For example, you could just use a sequence with an Id element for the value and an IdType element to indicate which form of identifier is provided. You would
then validate the Id value based on the IdType.
<xs:element name="Id" type="xs:string"/>
<xs:element name="IdType" type="tIdType"/>
When you have to implement a third party contract with things like this you just have to deal with the weirdness the best you can, and encourage them to simplify their contract in the future.