Citing from the book of Michael L. Scott, Programming Language Pragmatics, section 7.1.1 (The definition of Types), p.322:
There are at least three ways to think about types, which we may call the denotational, constructive, and abstraction-based points of view. [...] From the constructive point of view, a type is either one of a small collection of built-in types (integer, character, Boolean, real, etc.; also called primitive or predefined types), or a composite type created by applying a type constructor (
record
,array
,set
etc.) to one or more simpler types. (This use of the term "constructor" is unrelated to the initialization functions of C++ and Java. [...]
Therefore, from a theoretical POV, those terms (primitive, built-in, predefined - I will add basic too) are all more or less synonyms and they are all understandable in contrast with composite types, which are built from them using, possibly in a recursive manner, some kind of "operation on types" (an array of char, a collection of pointers, a list of records each consisting of a float and a string, etc.)
I agree with @KeithThompson that from a practical POV each language will use (some of) these terms assigning very specific meanings to them, thus you would have to browse the particular language specification to know what is meant in that context.