My recommendation would be to avoid inheritance in domain models as much as possible. You may come across a use-case for inheritance every-so-often but it would probably relate more to technical implementation details than the UL.
I also avoid designing classification as structure since it makes you model less flexible. Structure should reflect the "fixed" bits that really are not going to change such as Invoice
/InvoiceItem
. A type of invoice item seems to fit as a classification. These things can be tricky to spot but when you have a class explosion it may be a red flag. As soon as domain experts start breaking down concepts into "types" then you are probably looking at a classification structure of sorts.
Also, avoid injecting services into domain objects. You may opt for double-dispatch where a service, that implements a service interface, is injected into the relevant method and the method calls the service to obtain, say, the relevant tax. Another way, that I prefer, is to rather pass in the value(s) required by the method.
Keep in mind that there are going to be technical implementation details that are not going to be part of the UL so don't worry about having each part of the UL represented as a class. As long as you have the object behaviour and shape of the UL captured in some form, and the UL can be completely represented, then you shouldn't have any issues.