INSPIRE code lists are represented as SKOS concept schemes, and their codes as SKOS concepts (see here). Consequently, the range of a property with a code list as value type can only be specified using the generic class skos:Concept.
IMHO the assertion "the range of a property with a code list as value type can only be specified using the generic class skos:Concept" is incorrect. It would be perfectly acceptable to:
Define a subclass of skos:Concept to represent to subset of skos:Concept belonging to a particular list; e.g. my:Natura2000DesignationValue_Concept
Add a formal definition to this subclass to define it as the set of all skos:Concept that have a skos:inScheme property pointing a specified ConceptScheme, e.g. (pseudo-code) my:Natura2000DesignationValue_Concept owl:equivalentTo [ skos:inScheme value <http://inspire.ec.europa.eu/codelist/Natura2000DesignationValue> ]
§ 9.4.9. Vocabulary reference at https://inspire-eu-rdf.github.io/inspire-rdf-guidelines/#ref_cr_prop_vocabulary_reference states :
IMHO the assertion "the range of a property with a code list as value type can only be specified using the generic class skos:Concept" is incorrect. It would be perfectly acceptable to:
my:Natura2000DesignationValue_Concept
my:Natura2000DesignationValue_Concept owl:equivalentTo [ skos:inScheme value <http://inspire.ec.europa.eu/codelist/Natura2000DesignationValue> ]
I actually do that quite often in my ontologies.