diff --git a/dvc/output.py b/dvc/output.py
--- a/dvc/output.py
+++ b/dvc/output.py
@@ -188,7 +188,7 @@ def load_from_pipeline(stage, data, typ="outs"):
                 Output.PARAM_PERSIST,
                 Output.PARAM_CHECKPOINT,
                 Output.PARAM_REMOTE,
-                Annotation.PARAM_DESC,
+                *ANNOTATION_FIELDS,
             ],
         )
 
diff --git a/dvc/schema.py b/dvc/schema.py
--- a/dvc/schema.py
+++ b/dvc/schema.py
@@ -3,7 +3,7 @@
 from voluptuous import Any, Optional, Required, Schema
 
 from dvc import dependency, output
-from dvc.annotations import Annotation
+from dvc.annotations import ANNOTATION_SCHEMA
 from dvc.output import CHECKSUMS_SCHEMA, Output
 from dvc.parsing import DO_KWD, FOREACH_KWD, VARS_KWD
 from dvc.parsing.versions import SCHEMA_KWD, lockfile_version_schema
@@ -48,10 +48,10 @@
 
 OUT_PSTAGE_DETAILED_SCHEMA = {
     str: {
+        **ANNOTATION_SCHEMA,  # type: ignore
         Output.PARAM_CACHE: bool,
         Output.PARAM_PERSIST: bool,
         Output.PARAM_CHECKPOINT: bool,
-        Annotation.PARAM_DESC: str,
         Output.PARAM_REMOTE: str,
     }
 }
diff --git a/dvc/stage/serialize.py b/dvc/stage/serialize.py
--- a/dvc/stage/serialize.py
+++ b/dvc/stage/serialize.py
@@ -38,8 +38,9 @@
 
 @post_processing(OrderedDict)
 def _get_flags(out):
-    if out.annot.desc:
-        yield PARAM_DESC, out.annot.desc
+    annot = out.annot.to_dict()
+    yield from annot.items()
+
     if not out.use_cache:
         yield PARAM_CACHE, False
     if out.checkpoint:

diff --git a/tests/func/test_dvcfile.py b/tests/func/test_dvcfile.py
--- a/tests/func/test_dvcfile.py
+++ b/tests/func/test_dvcfile.py
@@ -3,6 +3,7 @@
 
 import pytest
 
+from dvc.annotations import Annotation
 from dvc.dvcfile import (
     PIPELINE_FILE,
     PIPELINE_LOCK,
@@ -392,7 +393,9 @@ def test_dvcfile_load_dump_stage_with_desc_meta(tmp_dir, dvc):
                 "desc": "stage desc",
                 "meta": {"key1": "value1", "key2": "value2"},
                 "deps": ["foo"],
-                "outs": [{"bar": {"desc": "bar desc"}}],
+                "outs": [
+                    {"bar": {"desc": "bar desc", "meta": {"key": "value"}}}
+                ],
             }
         }
     }
@@ -401,7 +404,9 @@ def test_dvcfile_load_dump_stage_with_desc_meta(tmp_dir, dvc):
     stage = dvc.stage.load_one(name="stage1")
     assert stage.meta == {"key1": "value1", "key2": "value2"}
     assert stage.desc == "stage desc"
-    assert stage.outs[0].annot.desc == "bar desc"
+    assert stage.outs[0].annot == Annotation(
+        desc="bar desc", meta={"key": "value"}
+    )
 
     # sanity check
     stage.dump()

`labels`/`type`/`desc` support in `dvc.yaml` file.


tests/func/test_dvcfile.py::test_dvcfile_load_dump_stage_with_desc_meta
tests/func/test_dvcfile.py::test_dvcfile_dump_preserves_comments tests/func/test_dvcfile.py::test_dvcfile_try_dumping_parametrized_stage[data1-build@us] tests/func/test_dvcfile.py::test_remove_stage_removes_dvcfiles_if_no_stages_left tests/func/test_dvcfile.py::test_dvcfile_try_dumping_parametrized_stage[data0-build-us] tests/func/test_dvcfile.py::test_remove_stage_preserves_comment tests/func/test_dvcfile.py::test_run_load_one_for_multistage_non_existing_stage_name tests/func/test_dvcfile.py::test_dvcfile_dump_preserves_desc tests/func/test_dvcfile.py::test_remove_stage_lockfile tests/func/test_dvcfile.py::test_remove_stage_dvcfiles tests/func/test_dvcfile.py::test_remove_stage_on_lockfile_format_error tests/func/test_dvcfile.py::test_try_get_single_stage_from_pipeline_file tests/func/test_dvcfile.py::test_run_load_one_for_multistage_non_existing tests/func/test_dvcfile.py::test_load_all_multistage tests/func/test_dvcfile.py::test_dvcfile_dump_preserves_meta tests/func/test_dvcfile.py::test_load_all_singlestage tests/func/test_dvcfile.py::test_remove_stage tests/func/test_dvcfile.py::test_has_stage_with_name tests/func/test_dvcfile.py::test_stage_collection tests/func/test_dvcfile.py::test_run_load_one_on_single_stage tests/func/test_dvcfile.py::test_run_load_one_for_multistage