Se puoi fornire alla classe funzionalità utili sufficienti a giustificare la complessità aggiuntiva di non essere una stringa, fallo. Per identificatori come ISBN e ISIN, sospetto che non sia così. 
 Affinché una classe identificatore sia utile, mi aspetto che assomigli a qualcosa del tipo: 
class ISIN {
    fromCUSIP()
    fromRawISINString()
    toString(ISIN::FormatType)
    getExchange()
    getCountryCode()
    getLastFourDigits()
    getWhateverCode()
    ...
}
 Se invece è più simile a questo: 
class ISIN {
    getString()
    setString()
}
 Quindi eliminerei completamente la classe, userei stringhe regolari ovunque e assicurarmi di usare costantemente "isin" in tutti i nomi delle variabili rilevanti. 
 Si noti che in alcune lingue, l'aggiunta di un nuovo tipo non ha quasi nessuna "complessità aggiunta" nei programmi tipici, nel qual caso si sarebbe incoraggiati a creare il nuovo tipo anche se non aveva alcuna funzionalità. Ma questo non è il caso della maggior parte dei linguaggi OOP tradizionali come il C ++.