Service and Project are actually Schema objects, just not ones that you have access to. Saleforce tries to resolve SObject types before failing completely. See the Type Resolution documentation for more details on how names are resolved. If you get to Step 4, and the object happens to be something that really does match an SObject, you'll get that error. One of the most common examples I have is:
Product2 p = new Product();
This simple typo produces the same error; Product was deprecated many versions ago, and isn't available in newer code. These reserved objects are either (a) deprecated objects, (b) features not enabled in your org, (c) features not yet exposed in future releases, or (d) features used internally by Salesforce or otherwise support the application indirectly.
This error occurs on "hidden" objects simply because the standard schema is actually the same for all orgs; you can consider them "hard-coded" into the core platform. In fact, I've actually written some code that exposes hidden objects by the key prefix, which is how I found things like:
1gh | GitHubRepositoryLink
1gp | GitHubPushOperation
1rp | Repository
4sr | Service
4st | ServiceDataType
4sv | ServiceVersion
I don't know if they're new (pending) features, or things used internally, but you can find some interesting things if you did deep enough. Usually, the best you can do is to pretend the error is the same as an "unknown variable" error, unless you're expecting to have your deployment work and it doesn't (this usually means you haven't enabled a feature in your org), in which case, you'll want to Google what the object does and what feature it's used for.
Interestingly, it appears that Project doesn't have a key prefix, which probably means it shares its key prefix, which is the only reason I know of why my code would fail (or, it's actually even more hidden than I thought).